对象的类型--接口

81 阅读1分钟
  • 在TypeScript中,使用接口来定义对象的类型。
interface Person {
    name: string;
    age: number;
}

//定义变量tom,类型为Person
let tom: Person = {
    name: 'Tom',
    age: 25
}

定义的变量比接口少一些属性是不允许的

interface Person {
    name: string;
    age: number
}

//会报错
let tom: Person = {
    name: 'Tom'
}

多一些属性也是不允许的:

interface Person {
    name: string;
    age: number
}

//会报错
let tom: Person = {
    name: 'Tom',
    age: 19,
    gender: 'male'
}

可见,赋值的时候变量的形状必须和接口形状保持一致。

  • 可选属性

有时候我们希望不要完全匹配一个形状,那么可以用可选属性(可选属性的含义是该属性可以不存在):

interface Person {
    name: 'Tom';
    age?: number;
}

//不会报错
let tom: Person {
    name: 'Tom'
}

这时仍然不允许添加未定义属性:

let tom: Person = {
    name: 'Tom',
    age: 19,
    gender: 'male' //不允许
}
  • 任意属性
interface Person {
    name: string;
    age: number;
    [propName: string]: any
}

注意:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。

interface Person {
    name: string;
    age?: number;
    [propName: string]: string
}
let tom: Person = {
    name: 'Tom',
    age: 19, //报错,任意属性类型为string number不是string的子集
    gender: 'male'
}

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

interface Person {
    name: string;
    age?: number;
    [propName: string]: string | number
}
  • 只读属性

有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用readonly定义只读属性:

interface Person {
    readonly id: number;
    name: string;
    age?: number;
    [propName: string]: any
}

let tom: Person = { //id是必选属性,赋值时未赋值会报错
    name: 'Tom',
    gender: 'male'
}
tom.id = 0 //id为只读属性,初始化后不能再改