为什么TypeScript带索引签名的对象类型允许赋值为空对象?
为什么One类型可以接受空对象赋值?
索引签名[key: string]: string的语义是只要对象上存在字符串类型的键,对应的值就必须是string类型,它没有强制要求对象必须包含任意数量的键。空对象没有任何字符串键,完全符合这个约束,所以不会触发报错。
而Two接口的语义是必须包含first、second两个string类型的必填属性,空对象缺少这两个属性,自然会触发类型错误。
后续动态添加属性的场景该用类型注解还是类型断言?
优先选择类型注解。类型断言的本质是跳过TS的类型校验,强制让编译器认为值符合指定类型,会带来隐式的类型风险:比如你用{} as Two之后如果忘了给first、second赋值,后续访问这两个属性时TS不会给出任何错误提示,直到运行时才会发现问题。
分两种场景给具体方案:
- 如果是动态键的字典场景(也就是你定义的
One类型),直接用类型注解即可:const example: One = {},后续给对象添加键值对时,TS会自动校验值是否为string类型,既灵活又安全。 - 如果是固定属性的接口场景(比如
Two类型),尽量不要先创建空对象再补属性,最好在初始化时就把所有必填属性赋值完成。如果确实需要分步赋值,可以先声明为Partial<Two>类型(自动把所有属性转为可选),等所有属性赋值完成后,再通过类型守卫收窄为Two类型,比直接类型断言安全很多。
内容的提问来源于stack exchange,提问作者Subrato Pattanaik
相关产品推荐
相关产品推荐

