Мне интересно, есть ли способ разрешить окончательное значение для выражения (с использованием API компилятора TypeScript), которое будет работать аналогично getTypeAtLocation.
Возьмем следующий пример:
const g = {
a: 'hello'
}
export enum wonkyEnum {
A, // = 0
B = 1,
C = g['a'] as any,
D = "str" as any
E = [ ...[1,2,3] ][2]
}
- В этом примере C, D и E не будут работать с getConstantValue ().
- D легко проанализировать, однако C и E являются примерами более глубоких проблем из-за используемых выражений, ссылок и т. Д.
Я надеюсь, что существует даже частичное решение, которое не потребует написания задействованного рекурсивного парсера, охватывающего все возможные непредвиденные обстоятельства для выражения инициализатора. Если в TS ничего не отображается, может быть полезен сторонний код с открытым исходным кодом.
В противном случае поможет любая деталь, которая поможет мне узнать все возможные варианты узлов в этом месте!
У меня уже есть надежная система рекурсивного синтаксического анализатора, которую я использую в основном для прохождения структуры Type, но ее также можно реализовать для Node / Kind. В основном я хотел бы быть уверен, что не загромождаю код без надобности и не изобретаю велосипед перед тем, как пойти по этому пути.
Спасибо!
Редактировать
Ответ Дэвида, приведенный ниже, правильный - нет возможности сделать это с помощью TS.
При дальнейшем изучении, чтобы охватить все случаи, потребуется фактическая оценка. Это может стать беспорядочным и во многих случаях невозможным (см. Комментарии ниже).
К счастью, в случае перечислений TypeScript обычно может получить ответ с помощью метода getConstantValue ().
В качестве запасного варианта мы рекурсивно проанализируем узел инициализатора, охватывающий несколько случаев выражения (как показано ниже):
// key is tested for node.kind equality in parseInitializer()
const valueParsers = Map<number | number[], (node: any) => string | number | boolean | null>([
[SyntaxKind.TrueKeyword, () => true],
[SyntaxKind.FalseKeyword, () => false],
[SyntaxKind.NullKeyword, () => null],
[SyntaxKind.StringLiteral, (node: LiteralLikeNode) => node.text],
[
[SyntaxKind.AsExpression, SyntaxKind.ParenthesizedExpression, SyntaxKind.TypeAssertionExpression],
(node: any) => parseInitializer(node.expression) // recursive call
],
]);
Если у кого-то есть идеи, как немного расширить его, не слишком сумасшедший, не стесняйтесь комментировать ниже!
eval
? - person Gerrit0   schedule 11.12.2019[1, 2, 3][2]
, но не _2 _..., который может случайно сработать, если эти переменные были определены в исполняемый код) - person David Sherret   schedule 11.12.2019