应用场景
上一章的基础数据类型能够保证变量类型的准确,但是遇到嵌套复杂的对象结构、类、函数,我们应该如何进行类型约束呢?
Typescript
通过 接口(Interface)
来约束 对象
、函数
、类
这些结构复杂的类型。
当多人协作编程的时候,每个人的编程习惯不一致,而 Javascript
又具有随意性,接口(Interface)
相当于在几位程序员之间定义了一套约束规则,大家都必须尽量遵守规则。如果有人破坏规则,Typescript
编译器将会编译失败,要求程序员纠正错误。这对多人开发来说,非常重要。
基础语法
新建index.ts文件,定义接口如下:
interface Animal {
species: string;
habitat: string;
legs: number;
}
let cat: Animal = {
species: '猫科',
habitat: '陆地',
legs: 4,
color:'black', //多余属性,此处报错
};
在终端中输入编译指令 tsc index.ts
,编译之后的代码如下:
var cat = {
species: '猫科',
habitat: '陆地',
legs: 4
};
通过编译,你会发现,编译器依赖于 Interface
进行类型检查,编译成功之后,Interface
将会被移除。
注意:
- 接口名称要首字母大写,接口内部的属性以分号
;
分割。 - 如果没有特殊声明,定义的变量比接口少了一些属性是不允许的,多一些属性也是不允许的,赋值的时候,变量的形状必须和接口的形状保持一致。
接口属性
可选属性
接口里的属性不全都是必需的。 有些是只在某些条件下存在的。此时,我们使用可选属性。
带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个?
符号。
interface Animal {
species: string;
habitat: string;
legs?: number;
}
//legs为可选属性
let cat: Animal = {
species: '猫科',
habitat: '陆地',
};
只读属性
一些对象属性只能在对象刚刚创建的时候修改其值。 你可以在属性名前用 readonly
来指定只读属性:
interface Car {
readonly id: number;
name: string;
}
let benz: Car = {
id: 89757,
name: 'S560',
};
benz.id = 9527;
// index.ts(14,5): error TS2540: Cannot assign to 'id' because it is a constant or a read-only property.
任意属性
某些场景下,我们希望接口拥有n个任意属性,语法是用 []
将属性包裹起来:
interface Clothes {
color: string;
size: string;
price: number;
[propName: string]: any;
}
let coat: Clothes = {
color: '黄色',
size: 'M',
price: 149,
type: '春秋款',
inventory: 5000,
}
一个接口中只能定义一个任意属性。如果接口中有多个类型的属性,则可以在任意属性中使用联合类型:
interface Clothes {
color: string;
size: string;
price: number;
[propName: string]: string | number;
}
let coat: Clothes = {
color: '黄色',
size: 'M',
price: 149,
type: '春秋款',
inventory: 5000,
}
接口本质
接口 Interface
本质上是一种约束契约。无论现在编写这段代码的程序员,还是将来某一刻试图修改代码的程序员,都要尽量遵守这一契约。当然,如果理由充分,你也可以修改接口,扩展它的契约规则。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。