TS 之对象的类型 — 接口
在 TypeScript 中,我们使用接口(Interface
)来定义对象的类型。
什么是接口
在面向对象语言中,接口(Interface
)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes
)去实现(implement
)。
TypeScript 中的接口是一个非常灵活的概念,处理可用于对类的一部分进行抽象以外,也常用于「对象的形状(Shape)」进行描述。
简单的例子
// 接口一般首字母大写 interface Person { name: string, age: number } let frankie: Person = { name: 'Frankie', age: 22 }
上述例子中,我们定义了一个接口 Person
,接着定义了一个变量 frankie
,它的类型是 Person
。这样,我们就约束了 frankie
的形状必须是和接口 Person
一致。
定义的变量比接口少了或者多了一些属性是不允许的:
interface Person { name: string, age: number } let frankie: Person = { name: 'Frankie' } // (1)少了 age 属性 // Property 'age' is missing in type '{ name: string; }' but required in type 'Person'. // (2)多了 height 属性 let mandy: Person = { name: 'Mandy', age: 22, height: 180 } // Type '{ name: string; age: number; height: number; }' is not assignable to type 'Person'. // Object literal may only specify known properties, and 'height' does not exist in type 'Person'.
可见,赋值的时候,变量的形状必须和接口保持一致。
可选属性
有时我们希望不要完全匹配一个形状,那么可以用可选属性:
interface Person { name: string, age?: number } let frankie: Person = { name: 'Frankie' } let mandy: Person = { name: 'Mandy', age: 22 }
可选属性的含义是该属性可以不存在,但这时仍然不允许添加未定义的属性。
任意属性
有时候,我们希望一个接口允许有任意的属性,可以使用如下方式:
interface Person { name: string, age?: number, [propName: string]: any } let frankie: Person = { name: 'Frankie', sex: 'male', height: 180, }
使用了 [propName: string]
定义了任意属性取 string
类型的值。
需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。
interface Person { name: string, age?: number, [propName: string]: string } let frankie: Person = { name: 'Frankie', age: 20, height: '180', } // Property 'age' of type 'number' is not assignable to string index type 'string'. // Type '{ name: string; age: number; height: string; }' is not assignable to type 'Perso n'. // Property 'age' is incompatible with index signature. // Type 'number' is not assignable to type 'string'.
上述例子中,任意属性的值允许是 string
,但是可选属性 age
以及任意属性 height
的值却是 number
,number
不是 string
的子属性,所以报错了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论