You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何将字符串字面量传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:32:08