作用:匹配形状是否一样,一般常用在对象上。
一般情况下:
// 注意:属性数量、名称得保持一致
interface Obj {
name: string
}
let obj: Obj = {
name: 'huangzi',
// age: 23 // 这样会报错
}
1、重名->重合
interface Obj {
name: string
}
interface Obj {
age: number
}
let obj: Obj = {
name: 'huangzi',
age: 23
}
2、任意属性 [propName: string]
需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集
interface Obj {
name: string
[propName: string]: any // 这里的类型不能随便写,假如写为string,则接口Obj的内容都为string类型
// 写为any,因为不确定到底会有哪些类型
}
let obj: Obj = {
name: 'huangzi', // 定义的值必须与接口保持一致
age: 23, // 不再校验
label: '人' // 不再校验
}
3、?(可选操作符),readonly(只读属性)
interface Obj {
name: string
age?: number // 可选 ?
}
let obj: Obj = {
name: 'huangzi'
}
interface Obj {
readonly id: string, // readonly修饰符
age: number,
readonly cb: () => string
}
let obj: Obj = {
id: 'huangzi',
age: 23,
cb: () => { return '123' }
}
obj.id = 'huang' // 报错 现在是只读状态,不可修改
obj.cb = () => { return '222' } // 报错 现在是只读状态,不可修改
4、接口继承 extends
// 继承相当于继续合成
interface Obj extends Obj1 {
name: string,
age: number,
readonly cb: () => string
}
interface Obj1 {
id: string,
}
let obj: Obj = {
name: 'huangzi',
age: 23,
cb: () => { return '123' },
id: '123456'
}
let ob: Obj1 = {
id: '123456'
}
5、定义函数
interface Fn {
// 是方法,所以是(),有参数且是string类型;返回的是number类型的数组
(name: string): number[]
}
// 对fn进行约束
const fn: Fn = function (name: string) {
return [20] // 返回的是number类型的数组
}