考虑一下这个例子:
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而言,如果includes与undefined进行检查,那么它是非常好的,只有TypeScript对此不满意。在这里满足TypeScript的好方法是什么?
发布于 2022-03-09 18:18:02
一种方法是将数组转换为string | undefined数组。这可能是我最喜欢的方法,因为它不会在转移的JavaScript代码中留下任何痕迹。而且,它仍然可以防止您意外地检查number,这实际上是没有意义的。
const someTest = (['creditCard', 'payPal'] as (string | undefined)[]).includes(someObj.paymentData?.paymentMethod);这在TypeScript代码中有点冗长,因此还有两个选项:
如果定义了someObj.paymentData?.paymentMethod,则预先检查:
const someTest = !!someObj.paymentData?.paymentMethod && ['creditCard', 'payPal'].includes(someObj.paymentData.paymentMethod);如果undefined使用空合并运算符(??),则通过返回到空字符串来确保该值始终是字符串:
const someTest = ['creditCard', 'payPal'].includes(someObj.paymentData?.paymentMethod ?? '');为了进一步参考,下面是GitHub上的一个相关线程-- Array.includes函数的类型:https://github.com/microsoft/TypeScript/issues/26255
发布于 2022-03-09 18:38:58
发布于 2022-03-09 18:32:28
理想情况下,将定义paymentMethod类型。通常这是由一个API定义的,如果不是,您应该定义它:
type PaymentMethod = 'creditCard' | 'payPal';
interface SomeType {
paymentMethod?: PaymentMethod;
}
const someObj: SomeType = {};
const someTest = ['creditCard', 'payPal'].includes(someObj.paymentMethod);https://stackoverflow.com/questions/71414196
复制相似问题