Как получить аргумент разрешенного типа массива (API компилятора tsc)

Я уже видел этот другой вопрос, но хотя имя похоже, вопрос на самом деле другой, потому что они пытаются получить тип свойства, который оказывается таким же, как аргумент универсального типа, но я пытаюсь получить фактический аргумент разрешенного типа, потому что я хочу получить тип T из Array<T>, а внутри типа массива нет свойства типа T.

Итак, у меня есть такая функция:

import ts from 'typescript'

function convertType(tc: ts.TypeChecker, type: ts.Type) {
    if (type.symbol.name === 'Array') {
        debugger;
        // How do I get the resolved type of T?
    }
    else {
        //...
    }
}

Я заметил, что если я отлажу функцию и наведу курсор на type, у нее будет свойство с именем resolvedTypeArguments, которое будет иметь именно тот тип, который мне нужен. Так что я мог бы просто сделать (type as any).resolvedTypeArguments, но это было бы взломом, и мне интересно, есть ли официальный способ сделать это.

Я предполагал, что мне придется использовать одну из функций is..., чтобы преобразовать тип во что-то, имеющее свойство resolvedTypeArguments, но нигде во всем файле typescript.d.ts нет упоминания о resolvedTypeArguments, поэтому кажется, что я вообще не должен иметь доступа к этому члену.


person Juan    schedule 18.07.2021    source источник


Ответы (1)


Вам нужно получить тип параметра первого типа:

const params = checker.getTypeArguments(type);
console.log(checker.typeToString(params[0])); // T
person Gerrit0    schedule 18.07.2021
comment
Похоже, это должно работать, но я не могу передать type в getTypeArguments, потому что функция принимает TypeReference. Как мне получить TypeReference от Type? - person Juan; 18.07.2021
comment
Кажется, я могу использовать tsutil isTypeReference для его безопасной трансляции. - person Juan; 18.07.2021