定义
字面量方式
let obj: { name: string; age: number }
- 给参数 obj 添加了一个类型,该类型有 2 个属性:name 和 age,分别是 string 和 number 类型
- 中间可以用 , 或 ; 隔开
interface 方式
一般都使用接口(interface)来定义对象的类型
interface Person {
name: string;
age: number;
}
type 方式
也可以使用类型别名的方式
type Person = {
name: string;
age: number;
}
NOTE
type
和interface
区别:
- interface 只能用于对象,type 能够表示非对象类型
- interface 使用
extends
进行扩展,type 使用&
进行扩展- interface 同名可以自动合并,type 不能同名
- interface 中可以用 this
可选属性(Optional Properties)
在属性名称后面加上 ?
表示该属性是可选的,所以在访问可选属性的属性和方法前需要检查
可选属性等同于允许赋值为 undefined
const obj: {
x: number;
y?: number;
} = { x: 1, y: undefined };
只读属性(readonly Properties)
属性名前面加上 readonly
关键字,表示不能重新赋值,但是如果是对象,可以修改其内部属性
interface SomeType {
readonly prop: string
}
索引签名(Index Signatures)
对象的属性非常多,或者不知道属性叫什么名字时用索引签名
索引签名的类型只允许:string
,number
,symbol
interface Obj {
[prop: string]: string
}
prop 可以随便取名,表示 Obj 对象里的属性类型为 string,值也是 string
也就是说,不管这个对象有多少属性,只要属性名为字符串,且属性值也是字符串,就符合这个类型声明
interface 继承
interface 可以使用 extends
继承属性,可以继承多个
interface 继承 interface
interface A {
a: string
}
interface B {
b: number
}
interface C extends A, B {}
const cc: ColorfulCircle = {
a: "str",
b: 1,
}
如果子接口与父接口存在同名属性,那么子接口的属性会覆盖父接口的属性。注意,子接口与父接口的同名属性必须是类型兼容的,不能有冲突,否则会报错。
interface 继承 type
interface 可以继承 type 命令定义的对象类型
interface 继承 class
interface 还可以继承 class,即继承该类的所有成员
interface 合并
多个同名接口会合并成一个接口,同一个属性如果有多个类型声明,彼此不能有类型冲突
interface A {
a: string
}
interface A {
b: number
}
交叉类型(Intersection Types)
主要用于组合对象类型
type A = {
a: string
}
type B = {
b: number
}
type C = A & B
type 也可以利用 interface 进行交叉