TypeScript-可选属性和索引签名

简介: TypeScript-可选属性和索引签名

前言


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

interface FullName {
    firstName: string
    lastName: string
}
function say({firstName, lastName}: FullName): void {
    console.log(`我的姓名是: ${firstName}_${lastName}`);
}
say({firstName: "BN", lastName: "Tang"});
  • 然后继续来改造一下如上的代码,我们将 lastName 不给了,来看看会发生什么情况:

  • 发现直接就是报错了,那么我们将 lastName 给加上并且还多给一个 middleName 来看看是不是如上所说的 只能是接口当中限定的一模一样

  • 经过如上的演示之后就可以证明我说的是没有问题的,然后我再来进行总结一下如上的注意点的即可





接口注意点


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

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

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 不传在看看:

  • 发现报错了,这个时候就需要利用可选属性了,在需要进行可选的属性的接口限定当中添加一个 ? 即可:

  • 如上所看的是少一个的情况,接下来来看看少多个的情况,只需要在可选的属性接口限定当中添加一个 ? 即可如下:
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 不用管我了)

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);
  • 多多个

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);




方式二(不推荐使用)


  • 使用 变量

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);




方式三


  • 使用 索引签名
  • 关于什么是索引签名,本章节先不用管,下一个章节我会单独在写一篇来进行介绍
  • 首先来看看使用索引签名来处理多一个或者多多个参数的情况

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"});

最后


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

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

相关文章
|
4月前
|
JavaScript 前端开发 编译器
TypeScript 类 第二章 【参数属性,存取器,静态属性】
TypeScript 类 第二章 【参数属性,存取器,静态属性】
58 2
|
11月前
|
JavaScript 安全 数据安全/隐私保护
TypeScript-属性装饰器
TypeScript-属性装饰器
48 0
|
4月前
|
JavaScript
TypeScript【类的继承、访问修饰符、readonly 修饰符、存取器、实例方法与静态方法、实例属性与静态属性、静态属性、抽象类】(三)-全面详解(学习总结---从入门到深化)
TypeScript【类的继承、访问修饰符、readonly 修饰符、存取器、实例方法与静态方法、实例属性与静态属性、静态属性、抽象类】(三)-全面详解(学习总结---从入门到深化)
51 0
|
1月前
|
JavaScript 编译器
typescript 解决变量多类型访问属性报错--工作随记
typescript 解决变量多类型访问属性报错--工作随记
|
4月前
|
JavaScript
react+typescript通过window.xxx挂载属性报错的解决方案
react+typescript通过window.xxx挂载属性报错的解决方案
166 0
|
3月前
|
索引 JavaScript 前端开发
21.【TypeScript 教程】索引类型
21.【TypeScript 教程】索引类型
31 2
|
3月前
|
JavaScript 前端开发 索引
typescript 可索引的类型
typescript 可索引的类型
|
3月前
|
JavaScript 前端开发 C++
typescript 只读属性
typescript 只读属性
|
4月前
|
JavaScript 开发者 索引
【亮剑】探讨了在TypeScript中为对象动态添加属性的三种方式
【4月更文挑战第30天】本文探讨了在TypeScript中为对象动态添加属性的三种方式:1) 使用索引签名允许添加任意属性,如`[key: string]: any`;2) 通过接口和类型别名提供编译时类型检查,例如`interface Person { name: string; age: number; }`;3) 利用类创建具有属性的对象,如`class Person { name: string; age: number; }`。每种方法有其适用场景,开发者可根据需求选择。
557 0
|
4月前
|
JavaScript 安全 前端开发
【亮剑】TypeScript 由于其强类型的特性,直接为对象动态添加属性可能会遇到一些问题
【4月更文挑战第30天】本文探讨了在 TypeScript 中安全地为对象动态添加属性的方法。基础方法是使用索引签名,允许接受任何属性名但牺牲了部分类型检查。进阶方法是接口扩展,通过声明合并动态添加属性,保持类型安全但可能导致代码重复。高级方法利用 OOP 模式的类继承,确保类型安全但增加代码复杂性。选择哪种方法取决于应用场景、代码复杂性和类型安全性需求。
50 0