Typescript如何让对象字面量函数返回严格类型 避免索引签名泄漏
方案1:使用泛型收窄辅助函数(最通用,无需手动声明类型)
你可以预先定义一个无额外运行时逻辑的泛型辅助函数,触发TypeScript的精确类型推导,自动去掉多余的索引签名:
// 可以全局复用的辅助函数,调用时不需要传任何类型参数 const narrow = <T extends object>(obj: T) => obj; const s = "myKey" as const; const myF = () => narrow({ [s]: 0, });
此时myF的返回类型会被自动推导为{ myKey: number },完全不需要手动编写字段类型注解,非常适合类型字段数量多的场景。
方案2:适配需要字面量值类型的场景
如果你需要返回值的类型也保留字面量(比如上例中值的类型是0而不是number),可以直接对返回的对象使用as const断言:
const s = "myKey" as const; const myF = () => ({ [s]: 0, } as const);
此时返回类型为{ readonly myKey: 0 }。
问题原因说明
TypeScript 默认处理带计算属性的对象字面量时,为了兼容后续可能的任意属性赋值,会自动为对象添加字符串索引签名。当计算属性的键是固定的字符串字面量类型时,这个索引签名属于多余的推导结果,通过泛型函数或者as const断言可以强制TS做更严格的精确类型推导,消除多余的索引签名。
内容的提问来源于stack exchange,提问作者Igor Loskutov
相关产品推荐
相关产品推荐

