首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeScript:如何在字符串数组上使用可能未定义的值(可选链接)的Array.includes

TypeScript:如何在字符串数组上使用可能未定义的值(可选链接)的Array.includes
EN

Stack Overflow用户
提问于 2022-03-09 18:18:02
回答 3查看 1.2K关注 0票数 3

考虑一下这个例子:

代码语言:javascript
运行
复制
type SomeType = {
  paymentData?: {
    paymentMethod?: string;
  }
}

const someObj: SomeType = {};

const someTest = ['creditCard', 'payPal'].includes(someObj.paymentData?.paymentMethod);

这在TypeScript中不起作用,因为它推断数组元素的类型为string,因此它要求与includes函数一起使用的值也是string类型,但是someObj.paymentData?.paymentMethod可能是未定义的,即类型是string | undefined。我不能使用非空断言操作符(!),因为它不能在可选链接之后使用。

就JavaScript而言,如果includesundefined进行检查,那么它是非常好的,只有TypeScript对此不满意。在这里满足TypeScript的好方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-09 18:18:02

一种方法是将数组转换为string | undefined数组。这可能是我最喜欢的方法,因为它不会在转移的JavaScript代码中留下任何痕迹。而且,它仍然可以防止您意外地检查number,这实际上是没有意义的。

代码语言:javascript
运行
复制
const someTest = (['creditCard', 'payPal'] as (string | undefined)[]).includes(someObj.paymentData?.paymentMethod);

这在TypeScript代码中有点冗长,因此还有两个选项:

如果定义了someObj.paymentData?.paymentMethod,则预先检查:

代码语言:javascript
运行
复制
const someTest = !!someObj.paymentData?.paymentMethod && ['creditCard', 'payPal'].includes(someObj.paymentData.paymentMethod);

如果undefined使用空合并运算符(??),则通过返回到空字符串来确保该值始终是字符串:

代码语言:javascript
运行
复制
const someTest = ['creditCard', 'payPal'].includes(someObj.paymentData?.paymentMethod ?? '');

为了进一步参考,下面是GitHub上的一个相关线程-- Array.includes函数的类型:https://github.com/microsoft/TypeScript/issues/26255

票数 5
EN

Stack Overflow用户

发布于 2022-03-09 18:38:58

您可以使用非空断言运算符 - !

代码语言:javascript
运行
复制
type SomeType = {
  paymentMethod?: string;
}

const someObj: SomeType = {};

const someTest = ['creditCard', 'payPal'].includes(someObj.paymentMethod!);

工作实例

票数 -1
EN

Stack Overflow用户

发布于 2022-03-09 18:32:28

理想情况下,将定义paymentMethod类型。通常这是由一个API定义的,如果不是,您应该定义它:

代码语言:javascript
运行
复制
type PaymentMethod = 'creditCard' | 'payPal';

interface SomeType {
  paymentMethod?: PaymentMethod;
}

const someObj: SomeType = {};

const someTest = ['creditCard', 'payPal'].includes(someObj.paymentMethod);
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71414196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档