定义

字面量方式

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

typeinterface 区别:

  • 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)

对象的属性非常多,或者不知道属性叫什么名字时用索引签名

索引签名的类型只允许:stringnumbersymbol

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 进行交叉