前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TypeScript-可选属性和索引签名

TypeScript-可选属性和索引签名

原创
作者头像
杨不易呀
发布于 2023-09-28 11:04:09
发布于 2023-09-28 11:04:09
3950
举报
文章被收录于专栏:杨不易呀杨不易呀

前言

本章节要介绍的内容为 TS 接口当中的可选属性和索引签名,如果要想先了解可选属性和索引签名之前首先要来介绍一下接口的注意点,接口的注意点就是如果你使用了接口类型来限定了函数的入参,限定了某个变量,这个时候你调用函数或者使用变量的时候就必须和接口里面的限定一模一样,例如之前我们接口当中有 firstNamelastName 那么你调用函数给入参的时候入参的参数当中就必须包含该两个参数,那么如何来验证一下我所说的这一点内容呢,其实很简单,直接上代码即可如下代码是正常情况下的代码:

代码语言:typescript
AI代码解释
复制
interface FullName {
    firstName: string
    lastName: string
}

function say({firstName, lastName}: FullName): void {
    console.log(`我的姓名是: ${firstName}_${lastName}`);
}

say({firstName: "BN", lastName: "Tang"});
  • 然后继续来改造一下如上的代码,我们将 lastName 不给了,来看看会发生什么情况:
image-20211127174335112
image-20211127174335112
  • 发现直接就是报错了,那么我们将 lastName 给加上并且还多给一个 middleName 来看看是不是如上所说的 只能是接口当中限定的一模一样
image-20211127174557443
image-20211127174557443
  • 经过如上的演示之后就可以证明我说的是没有问题的,然后我再来进行总结一下如上的注意点的即可

接口注意点

如果使用接口来限定了变量或者形参, 那么在给变量或者形参赋值的时候, 赋予的值就必须和接口限定的一模一样才可以, 多一个或者少一个都不行

好了经过了介绍了如上的注意点了之后就可以来看本章节的内容了,但是有时在企业开发中可以多一个也有可能少一个,那么少一个或少多个怎么做,那么这个时候就可以利用 可选属性 来进行完成了,首先来提一个需求来引出该示例,改造一下接口的限定内容,添加一个 middleName, 如果在调用函数时传入的形参当中有 middleName 我就输出接口当中完整的内容,否则就输出 firstName,和 lastName,改造之后的代码如下:

代码语言:typescript
AI代码解释
复制
interface FullName {
    firstName: string
    lastName: string
    middleName: string
}

function say({firstName, lastName, middleName}: FullName): void {
    if (middleName) {
        console.log(`我的姓名是:${firstName}_${middleName}_${lastName}`);
        return;
    }
    console.log(`我的姓名是:${firstName}_${lastName}`);
}

say({firstName: "BN", lastName: "Tang", middleName: "666"});
  • 然后这个时候我们将 middleName 不传在看看:
image-20211127175618283
image-20211127175618283
  • 发现报错了,这个时候就需要利用可选属性了,在需要进行可选的属性的接口限定当中添加一个 ? 即可:
image-20211127175725306
image-20211127175725306
  • 如上所看的是少一个的情况,接下来来看看少多个的情况,只需要在可选的属性接口限定当中添加一个 ? 即可如下:
代码语言:typescript
AI代码解释
复制
interface FullName {
    firstName: string
    lastName?: string
    middleName?: string
}

function say({firstName, lastName, middleName}: FullName): void {
    if (middleName) {
        console.log(`我的姓名是:${firstName}_${middleName}_${lastName}`);
        return;
    }
    console.log(`我的姓名是:${firstName}_${lastName}`);
}

say({firstName: "BN"});
  • 如上所看的都是少属性,接下来来看看多一个或者多多个的可选属性,多一个或者多多个其实就是绕开 TS 检查即可

方式一

  • 多一个,使用类型断言(告诉 TS 不用管我了)
image-20211127180525824
image-20211127180525824
代码语言:typescript
AI代码解释
复制
interface FullName {
    firstName: string
    lastName: string
    middleName: string
}

function say({firstName, lastName, middleName}: FullName): void {
    if (middleName) {
        console.log(`我的姓名是:${firstName}_${middleName}_${lastName}`);
        return;
    }
    console.log(`我的姓名是:${firstName}_${lastName}`);
}

say({firstName: "BN", lastName: "Tang", middleName: "666", abc: "123"} as FullName);
  • 多多个
image-20211127180609406
image-20211127180609406
代码语言:typescript
AI代码解释
复制
interface FullName {
    firstName: string
    lastName: string
    middleName: string
}

function say({firstName, lastName, middleName}: FullName): void {
    if (middleName) {
        console.log(`我的姓名是:${firstName}_${middleName}_${lastName}`);
        return;
    }
    console.log(`我的姓名是:${firstName}_${lastName}`);
}

say({firstName: "BN", lastName: "Tang", middleName: "666", abc: "123", 123: 123} as FullName);

方式二(不推荐使用)

  • 使用 变量
image-20211127181322141
image-20211127181322141
代码语言:typescript
AI代码解释
复制
interface FullName {
    firstName: string
    lastName: string
    middleName: string
}

function say({firstName, lastName, middleName}: FullName): void {
    if (middleName) {
        console.log(`我的姓名是:${firstName}_${middleName}_${lastName}`);
        return;
    }
    console.log(`我的姓名是:${firstName}_${lastName}`);
}

let obj = {firstName: "BN", lastName: "Tang", middleName: "666", abc: "123", 123: 123};
say(obj);

方式三

  • 使用 索引签名
  • 关于什么是索引签名,本章节先不用管,下一个章节我会单独在写一篇来进行介绍
  • 首先来看看使用索引签名来处理多一个或者多多个参数的情况
image-20211127181639012
image-20211127181639012
代码语言:typescript
AI代码解释
复制
interface FullName {
    firstName: string
    lastName: string
    middleName: string,

    [propName: string]: any
}

function say({firstName, lastName, middleName}: FullName): void {
    if (middleName) {
        console.log(`我的姓名是:${firstName}_${middleName}_${lastName}`);
        return;
    }
    console.log(`我的姓名是:${firstName}_${lastName}`);
}

say({firstName: "BN", lastName: "Tang", middleName: "666", abc: "123", 123: 123, def: "def"});
end02
end02
输入图片说明
输入图片说明

最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

输入图片说明
输入图片说明

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
LV.1
这个人很懒,什么都没有留下~
目录
  • 前言
  • 接口注意点
  • 方式一
  • 方式二(不推荐使用)
  • 方式三
  • 最后
加入讨论
的问答专区 >
1北京宏哥擅长4个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档