Skip to main content

接口

使用接口定义对象的类型

interface Point1 {
x: number,
y: string
}
function foo9(pt: Point1) {
console.log(pt)
}
foo9({x: 233, y: '233'})

接口是可以拓展继承的

interface Animal {
name: string
}

interface Bear extends Animal {
age: number
}

const bear: Bear = {
name: 'weini',
age: 23
}
console.log(bear.name, bear.age)

向现有的接口添加新字段(可同名方式拓展)

interface MyWindow {
count: number;
}
interface MyWindow {
title: string;
}
const window: MyWindow = {
count: 1,
title: '233'
}

可选属性

该属性可以不存在, 仍然不允许添加未定义的属性

对象属性名称后面加上 ? 代表这个值可以不传,比如 ?: string 就代表 string | undefined

interface Person {
name: string,
age?: number
}
let olu: Person = {
name: 'olu',
// age: 18 // age可不声明
}

任意属性

希望接口可以有任意属性,可以使用 [propName: string],定义任意属性取 string 类型的值

interface Person {
name: string,
age?: number,
[propName: string]: any
}
let olu: Person = {
name: 'olu',
drink: 'Coke'
}

一旦定义了任意属性,确定属性和可选属性的类型必须是其类型的子集

interface Person {
name: number[], // 类型“number[]”的属性“name”不能赋给“string”索引类型“string”
age?: number, // 类型“number | undefined”的属性“age”不能赋给“string”索引类型“string”
[propName: string]: string
}
let olu: Person = {
name: [1,2],
drink: 123 // 不能将类型“number”分配给类型“string”
}

上面这个例子,[propName: string]: string 定义任意属性取 string类型,已定义的 name 属性是数字数组不符合,已定义的 age 属性是 number 或 undefined 也不符合,drink 也不是 string 类型

一个接口只能定义一个任意属性,如果接口中有多个类型的属性,需要在任意属性中使用联合类型

interface Person {
name: number[],
age?: number,
[propName: string]: string | number[] | undefined | number
}
let olu: Person = {
name: [1,2],
drink: 123
}

只读属性

让字段只能在创建的时候被赋值,只读的约束存在于第一次对象赋值的时候,而不是第一次给只读属性赋值的时候

interface Person {
name: number[],
age?: number,
readonly hobby: string,
cb(): number,
[propName: string]: string | number[] | undefined | number | Function
}
let olu: Person = {
name: [1,2],
drink: 123,
hobby: 'sleep',
cb: (): number => 123
}

olu.hobby = 'eat' // 无法分配到 "hobby" ,因为它是只读属性