Компилятор Typescript как услуга: как проверить, назначается ли один тип другому?

Я делаю инструмент командной строки nodejs, который автоматизирует переименование символов в файлах Typescript, используя языковые службы Typescript.

Вы говорите инструменту: переименуйте все символы этого типа в этот символ. Как и resharper, он также будет переименовывать локальные переменные, свойства и т. Д. Поскольку он позволяет переименовывать сразу несколько символов, вы также можете поменять местами два имени символа, не требуя промежуточного временного уникального имени (например, переименовать Foo в Bar и наоборот).

Мне пришлось сделать частную функцию getSymbolInfoAtPosition в языковой службе общедоступной, чтобы сделать эту работу общедоступной, чтобы я мог получать информацию PullSymbol.

В настоящее время он обнаруживает только точные совпадения имени + типа, вызывая getNameAndTypeName в PullSymbol, но я хотел бы выполнить структурно совместимые совпадения.

В C # это просто, поскольку у Type есть метод IsAssignableFrom.

Кто-нибудь знает, как можно использовать компилятор Typescript как услугу, чтобы определить, является ли один PullSymbol структурно совместимым с другим PullSymbol?

Большое спасибо, Питер Фервивелен


comment
Я пытаюсь сделать что-то очень похожее. Вы нашли решение своей проблемы, использующее TypeScript TypeChecker? Большое спасибо!   -  person CodeSalad    schedule 22.04.2015
comment
Нет, к сожалению, я не решил эту проблему. Однако я думаю, что более новые версии Typescript используют совершенно другой API; Я еще не пробовал.   -  person Ziriax    schedule 23.04.2015


Ответы (2)


По сути, не похоже, что вы всесторонне проверяете, назначается ли один тип другому только через отражение. Функциональность для проверки того, может ли один тип присваиваться другому, уже реализована в машинописном тексте, она просто не публикуется публично, и нет реального способа получить ее, не изменяя библиотеку машинописных текстов вручную.

Одним из незамедлительных обходных путей может стать эффективная компиляция специального кода для назначения одного другому и проверки наличия ошибок компиляции.

Ответ на мой запрос раскрыть isTypeAssignableTo был положительным, поэтому, надеюсь, ответ изменится в ближайшее время.

[Обновление] похоже, что в конечном итоге он был обнаружен при слиянии ... Я не пробовал, хотя: https://github.com/microsoft/TypeScript/pull/33263/files#diff-c3ed224e4daa84352f7f1abcd23e8ccaR525-R527

person Meirion Hughes    schedule 28.10.2016

Я не уверен, каким будет прямое сравнение с методом C # isAssignableFrom, но, возможно, вы могли бы написать свою собственную логику для создания этой функции -

isAssignableFrom(pullSymbol): boolean {
    ....
    if (typeof pullSymbol === 'string') {
        // Is compatible with any type that allows strings
    }
    ....
}

Вы можете ознакомиться с некоторыми языковыми спецификациями здесь, чтобы найти такие вещи, как:

The Any type is a supertype of all types, and is assignable to and from all types.

Использование этой информации с некоторой жестко запрограммированной логикой может быть для вас решением.

person JMac    schedule 31.10.2014