TypeScript中如何避免对含单个异值键的对象使用类型断言
无需类型断言的解决方案
方法1:明确声明所有已知键的类型
直接在接口里把double和所有solo系列键的类型都明确标注,让TypeScript精准识别每个键的类型,彻底告别类型断言:
interface ErrState { double: [boolean, string]; solo1: boolean; solo2: boolean; solo3: boolean; // 依次补全到solo10 // 后续新增的boolean类型键也可直接在此添加 } const inicialErrState: ErrState = { double: [false, ""], solo1: false, solo2: false, // 补全solo3到solo10的初始值 };
之后使用err.solo1时,TypeScript会直接推断它是boolean类型,无需额外断言。
方法2:用模板字符串+Record批量定义solo键类型
如果solo系列键数量多,逐个写类型太繁琐,可借助TypeScript的模板字符串类型批量生成键名,再结合Record统一指定类型:
// 生成solo1到solo10的键名类型 type SoloKeys = `solo${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10}`; // 单独定义double的专属类型 interface BaseErrState { double: [boolean, string]; } // 交叉基础类型与solo键的批量类型 type FullErrState = BaseErrState & Record<SoloKeys, boolean>; const inicialErrState: FullErrState = { double: [false, ""], solo1: false, solo2: false, // 补全solo3到solo10的初始值 };
这种方式既避免了重复代码,又能让TypeScript准确识别每个solo键的类型,使用时同样不需要断言。
原写法需要断言的原因
你之前的类型定义{ [key: string]: [boolean, string] | boolean } & { double: [boolean, string] },虽然明确了double的类型,但索引签名[key: string]会让TypeScript认为所有字符串键都可能是[boolean, string] | boolean的联合类型,所以访问solo1时,TS无法确定它具体是哪一种,只能要求你用断言缩小类型范围。上面两种方法通过明确指定每个已知键的类型,从根源解决了这个问题。
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

