如何让TypeScript识别索引签名为string的对象的key仅为string类型
问题解答
为什么val的类型是string | number
这是TypeScript的默认设计行为:JavaScript中对象的数字键会被自动隐式转换为字符串,例如obj[123]和obj['123']指向完全相同的属性,因此TS处理带字符串索引签名的类型时,keyof操作符默认返回string | number联合类型,兼容JS的隐式转换逻辑。
如何让val仅识别为string类型
两种常用实现方案:
方案1:局部类型过滤(无需修改全局配置)
使用Extract工具类型从keyof返回结果里提取仅为string的部分:
type Obj = {[key: string]: string} const test = (obj: Obj) => { let val: Extract<keyof Obj, string>; // 此时val的类型为纯string }
方案2:全局编译配置修改
如果希望所有带字符串索引签名的类型的keyof默认返回纯string,可在tsconfig.json中开启keyofStringsOnly编译选项:
{ "compilerOptions": { "keyofStringsOnly": true } }
开启后原代码无需额外修改,keyof typeof obj会直接返回string类型。
内容的提问来源于stack exchange,提问作者Alexandre Annic
相关产品推荐
相关产品推荐

