TS 之对象的类型 — 接口

发布于 2023-05-04 21:21:24 字数 2473 浏览 40 评论 0

在 TypeScript 中,我们使用接口(Interface)来定义对象的类型。

什么是接口

在面向对象语言中,接口(Interface)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。

TypeScript 中的接口是一个非常灵活的概念,处理可用于对类的一部分进行抽象以外,也常用于「对象的形状(Shape)」进行描述。

简单的例子

// 接口一般首字母大写
interface Person {
    name: string,
    age: number
}

let frankie: Person = {
    name: 'Frankie',
    age: 22
}

上述例子中,我们定义了一个接口 Person,接着定义了一个变量 frankie,它的类型是 Person。这样,我们就约束了 frankie 的形状必须是和接口 Person 一致。

定义的变量比接口少了或者多了一些属性是不允许的:

interface Person {
    name: string,
    age: number
}

let frankie: Person = {
    name: 'Frankie'
}
// (1)少了 age 属性
// Property 'age' is missing in type '{ name: string; }' but required in type 'Person'.


// (2)多了 height 属性
let mandy: Person = {
    name: 'Mandy',
    age: 22,
    height: 180
}
// Type '{ name: string; age: number; height: number; }' is not assignable to type 'Person'.
// Object literal may only specify known properties, and 'height' does not exist in type 'Person'.

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

可选属性

有时我们希望不要完全匹配一个形状,那么可以用可选属性:

interface Person {
    name: string,
    age?: number
}

let frankie: Person = {
    name: 'Frankie'
}

let mandy: Person = {
    name: 'Mandy',
    age: 22
}

可选属性的含义是该属性可以不存在,但这时仍然不允许添加未定义的属性。

任意属性

有时候,我们希望一个接口允许有任意的属性,可以使用如下方式:

interface Person {
    name: string,
    age?: number,
    [propName: string]: any
}

let frankie: Person = {
    name: 'Frankie',
    sex: 'male',
    height: 180,
}

使用了 [propName: string] 定义了任意属性取 string 类型的值。

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

interface Person {
    name: string,
    age?: number,
    [propName: string]: string
}

let frankie: Person = {
    name: 'Frankie',
    age: 20,
    height: '180',
}

// Property 'age' of type 'number' is not assignable to string index type 'string'.
// Type '{ name: string; age: number; height: string; }' is not assignable to type 'Perso
n'.
// Property 'age' is incompatible with index signature.
// Type 'number' is not assignable to type 'string'.  

上述例子中,任意属性的值允许是 string,但是可选属性 age 以及任意属性 height 的值却是 numbernumber 不是 string 的子属性,所以报错了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

缱倦旧时光

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

懂王

文章 0 评论 0

清秋悲枫

文章 0 评论 0

niceone-tech

文章 0 评论 0

小伙你站住

文章 0 评论 0

刘涛

文章 0 评论 0

南街九尾狐

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文