Skip to content

TS清单 - 对象

对象的类型 - 接口

在TS中,使用接口interface来定义对象的类型。

基础DEMO举例

js
// 对象的具体实现要与接口保持一致,既不能多,也不能少。
interface Person {
    name: string;
    age: number;
    addr: string;
}

let bob: Person = {
    name: 'Bob',
    age: 28,
    addr: 'ShenZhen',
}

接口的命名规范

接口命名一般首字母大写。有的编程语言中会建议接口的名称加上 I 前缀。

可选属性 / 任意属性 / 只读属性

js
// 可选属性: 定义接口时,该属性名后面加问号?,表示当前属性可以在对象具体实现时不存在。
interface Person {
    name: string;
    age: number;
    addr?: string;
}

let bob: Person = {
    name: 'Bob',
    age: 28,
}

// 任意属性:下面接口定义表示 name 必须实现,age 可以选择性实现,其他属性可以任意实现
interface Person {
    name: string;
    age?: number;
    [propName: string]: any; // 如果 any 改成 string,则任意属性的值必须是字符型
}

let bob: Person = {
    name: 'Bob',
    age: 28,
    birth: '10-01'
}

// 只读属性:用 readonly 定义
interface Person {
    readonly name: string;
    age?: number;
    [propName: string]: any;
}

let bob: Person = {
    name: 'Bob',
    age: 28,
    birth: '10-01'
}
bob.name = 'Yuan'; // 报错:无法为“name”赋值,因为它是只读属性。

注意

只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候

js
// 只读属性:用 readonly 定义
// 只读属性也可以设置 可选
interface Person {
    readonly name?: string;
    age?: number;
    [propName: string]: any;
}

let bob: Person = {
    age: 28,
    birth: '10-01'
}
// 单独对只读属性赋值会报错,但是对整个对象进行重新赋值是OK的
bob = {
    name: 'Bob',
    age: 22,
    addr: 'SZ'
}
console.log(bob) // print: { name: 'Bob', age: 22, addr: 'SZ' }