如何将TypeScript字符串字面量类型转换为新对象类型的键?
错误原因
你写法的问题出在keyof T的使用上。当T是字符串字面量联合类型时,keyof T取的是所有字符串共有的方法属性(比如toString、substring这类),而不是把联合类型的每个成员作为键来遍历,所以你定义出来的LetterFlags根本不是你预期的对象类型,才会触发类型不匹配报错。
解决方案
要遍历联合类型的每个成员作为对象键,直接在映射类型里写[k in T]即可,正确的实现如下:
// 自定义泛型实现 type Flags<T extends PropertyKey> = { [k in T]: boolean }; type Letters = "a" | "b" | "c" | "d" | "e"; type LetterFlags = Flags<Letters>;
你也可以直接用TypeScript内置的Record工具类,不需要自己写泛型:
type Letters = "a" | "b" | "c" | "d" | "e"; type LetterFlags = Record<Letters, boolean>;
修改后再定义你的变量就不会有类型错误了。
内容的提问来源于stack exchange,提问作者ezgrs
相关产品推荐
相关产品推荐

