TypeScript中属性名为valueOf时的类型校验异常问题咨询
为什么用
valueOf作为属性名时TypeScript不报错? 先看第一个符合预期报错的示例:
type Paulo = { prop: string, otherValueOf: string, } type Treta = Record<keyof Paulo, () => Object> const ugulha : Treta = { //Error: Property 'otherValueOf' is missing prop: () => 1, }
再看第二个未报错的示例:
type Paulo = { prop: string, valueOf: string, } type Treta = Record<keyof Paulo, () => Object> const ugulha : Treta = { prop: () => 1, }
核心原因:valueOf是Object原型链的内置方法
这是因为valueOf是JavaScript所有对象天生从Object.prototype继承来的方法,TypeScript的结构类型检查会把原型链上的属性纳入兼容性判断:
- 第一个示例里的
otherValueOf是完全自定义的属性,不存在于任何内置原型上,所以Treta类型要求必须显式提供该属性,没写就会报错。 - 第二个示例里的
valueOf是所有普通对象默认就有的方法,TypeScript会自动检查这个继承来的方法是否符合Treta类型的要求。Object.prototype的valueOf()返回值类型兼容Object(JS里所有值都可被视为Object的实例),所以TypeScript认为这个继承来的valueOf已经满足类型定义,不需要你显式声明。
本质:TypeScript的结构类型系统特性
TypeScript采用结构类型系统,判断对象是否符合类型时,会检查对象的全部可用属性(包括原型链上的),而不仅仅是你显式声明的属性。对于内置原型上的属性,TypeScript默认认为所有对象都具备这些属性,所以当类型中包含这些属性时,不需要手动添加。
内容的提问来源于stack exchange,提问作者Paulo Fernando
相关产品推荐
相关产品推荐

