为何将字符串字面量传入TypeScript索引签名类型会返回原字面量?
TypeScript映射类型处理字符串字面量的疑问
先看你定义的映射类型和正常场景的表现:
type MyTest<T> = { [P in keyof T]: T[P]; }; type Result = MyTest<{hello: 'world', foo: 2}>; // ^? type Result = { hello: 'world', foo: 2 } 👍
当传入字符串字面量时,结果却和预期不符:
type Result2 = MyTest<"hello">; // ^? type Result2 = "hello" 👀
针对你的两个猜想,逐一解释:
猜想1不成立:
keyof "hello"等价于keyof string,也就是字符串原型链上的所有公共属性/方法名(比如toString、length、charAt等),映射后的类型其实等价于String接口,但TypeScript不会展示这个复杂的对象结构,而是通过类型简化规则,自动将其折叠为原始的字符串字面量类型"hello"。另外,映射后的属性值也不是never,比如"hello"["length"]的类型是number,"hello"["toString"]的类型是() => string。猜想2也不成立:
迭代过程是实际发生的,但TypeScript对映射结果做了特殊处理:当映射类型的结果与输入的原始字面量类型在语义上可兼容时,会直接返回原始类型,而非展开完整的映射对象,以此保证类型展示的简洁性。
内容的提问来源于stack exchange,提问作者stratis
相关产品推荐
相关产品推荐

