有没有办法在条件打字稿中使用扩展字符串进行推理?

Is there a way to make inference work with extended string in conditional typescript?

我正在尝试提取通用字符串文字类型,但打字稿推断 returns 仅提取字符串类型。

所以从技术上讲,一旦将字符串文字类型传递给函数,我们就无法再提取它。

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'?

这是Playground

中的代码

updateWithKey中,K没有出现在编译器可以自动推断的位置,所以被认为是允许的最通用的类​​型,即string.

但是条件类型 have special syntax 告诉编译器您希望推断实际类型:

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"