TypeScript:如何约束泛型N为字符串键字典的键且符合string类型
TypeScript泛型键约束问题解决方案
问题场景
当字典类型的键被约束为string时,TypeScript中keyof D类型的泛型仍会被推断为string | number | symbol。示例代码如下:
type Foo = { [key: string]: any } const bar = (blah: string) => { return blah; } const foo = <T extends Foo, N extends keyof T>(dict: T, key: N) => { bar(key); // 错误:类型'number'不能赋值给类型'string' console.log(dict); }
此时需要约束泛型N,使其既能传入要求string类型参数的bar函数,又必须是字典T的有效键之一。
解决方案
通过交集类型对泛型N进行双重约束,同时限定其为string类型和T的键:
修改后的代码
type Foo = { [key: string]: any } const bar = (blah: string) => { return blah; } const foo = <T extends Foo, N extends keyof T & string>(dict: T, key: N) => { bar(key); // 无报错,N同时满足是T的键且为string类型 console.log(dict); }
原理
keyof T & string表示取keyof T与string的交集,自动排除number和symbol类型的键,确保N是string类型,符合bar函数的参数要求。N extends keyof T保证了N一定是字典T的有效键,不会出现无效键传入的问题。
你也可以调换交集顺序,效果完全一致:
const foo = <T extends Foo, N extends string & keyof T>(dict: T, key: N) => { bar(key); console.log(dict); }
内容的提问来源于stack exchange,提问作者theahura
相关产品推荐
相关产品推荐

