TypeScript--接口

TypeScript 中,我们使用 接口(interface 来定义 对象的类型

示例

interface Person {
    name: string
    age: number
}

// ✅正确
// 对象的属性必须和接口保持一致
const tom1: Person = {
    name: 'Tom',
    age: 23,
}

// ❌错误
// Property 'age' is missing ...
// 缺少 'age' 属性
const tom2: Person = {
    name: 'Tom',
}

// ❌错误
// 'gender' does not exist in type 'Person'
// 'Person' 不存在 'gender' 属性
const tom3: Person = {
    name: 'Tom',
    age: 23,
    gender: 'male',
}

// ❌错误
// 'name1' does not exist in type 'Person'
// 'Person' 不存在 'name1' 属性
const tom4: Person = {
    name1: 'Tom',
    age: 23,
}

可选属性

可选属性的含义是该属性可以不存在。

interface Person {
    name: string
    age?: number
}

// ✅正确
const tom1: Person = {
    name: 'Tom',
    age: 23,
}

// ✅正确
const tom2: Person = {
    name: 'Tom',
}

// ❌错误
// 'gender' does not exist in type 'Person'
// 'Person' 不存在 'gender' 属性
const tom3: Person = {
    name: 'Tom',
    gender: 'male',
}

任意属性

有时候我们希望一个接口允许有任意的属性

interface Person {
    [key: string]: any
    name: string
}

// ✅正确
const tom1: Person = {
    name: 'Tom',
}

// ✅正确
const tom2: Person = {
    name: 'Tom',
    gender: 'male',
}

// ✅正确
const tom3: Person = {
    name: 'Tom',
    age: 23,
}

注意:

  • 如果在接口中定义了任意属性,那么接口中的其它属性的类型都必须是任意属性的类型的子集

示例:

interface Person {
    [key: string]: string
    name: string
}

// ❌错误
// Property 'age' of type 'number' is not assignable to string index type 'string'.
interface Person {
    [key: string]: string
    name: string
    age: number
}

Person 中定义了任意属性 [key: string],任意属性的类型为 string;因此 Person 中的其它属性 namename 属性的类型必须是 string 的子集 string null undefined

age 属性是 number 类型,number 类型不是 string 类型的子集,所以会报错。

注意:

  • 如果接口中有多个类型的属性,则可以在任意属性中使用联合类型

示例:

interface Person {
    [key: string]: string | number
    name: string
    age: number
}

// ✅正确
const tom1: Person = {
    name: 'Tom',
    age: 23,
    address: 'ShangHai',
    height: 180,
}

注意:

  • 一个接口中只能定义一个任意属性。

只读属性

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

interface Person {
    readonly idNo: number
    name: string
    age?: number
}

const tom1: Person = {
    idNo: 1000001,
    name: 'Tom',
}

// ❌错误
// Cannot assign to 'idNo' because it is a read-only
// 不能给 'idNo' 赋值,因为它是 'read-only' 的
tom1.idNo = 1000002

注意:

  • 只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候
interface Person {
    name: string
    readonly idNo?: number
}

const tom1: Person = {
    name: 'Tom',
}

// ❌错误
// Cannot assign to 'idNo' because it is a read-only
// 不能给 'idNo' 赋值,因为它是 'read-only' 的
tom1.idNo = 1000002
posted @ 2021-04-12 10:53  蓦然回首!  阅读(43)  评论(0编辑  收藏  举报