Есть ли способ заставить вывод работать с расширенной строкой в ​​условной машинописи? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь извлечь общий строковый литерал типа, но вывод из машинного текста возвращает вместо него только строку типа.

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

type Key<T extends string> = { key: T };

declare function getKey<T extends string>(key: T): Key<T>;

let someKey = getKey('check');

declare function updateWithKey<T, K extends string>(key: T): T extends Key<K> ? K : never;

let someUpdatedKey = updateWithKey(someKey); // Shouldn't be 'check'?

Вот код в Детская площадка

1 Ответ

2 голосов
/ 28 марта 2019

В updateWithKey, K не появляется в позиции, где он может автоматически выводиться компилятором, поэтому он считается наиболее допустимым типом, то есть string.

Но условные типы имеют специальный синтаксис , чтобы сообщить компилятору, что вы хотите, чтобы фактический тип выводился:

type Key<T extends string> = { key: T };

declare function getKey<T extends string>(key: T): Key<T>;

let someKey = getKey('check');

declare function updateWithKey<T>(key: T): T extends Key<infer K> ? K : never;

let someUpdatedKey = updateWithKey(someKey); // let someUpdatedKey: "check"
...