我正在尝试提取通用字符串文字类型,但typescript推断只返回类型字符串。
所以从技术上讲,一旦传递给函数的字符串文字类型,我们就不能再提取它了。
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"