Typescript 显式类型检查后无法推断常量的类型?(TS2349:无法调用其类型缺少调用签名的表达式。)
我在TypeScript中遇到了一个奇怪的问题,似乎我应该能够推断出常量是数组,并利用这些知识调用数组方法。然而,TypeScript显然无法确定值是否确实是数组,即使在显式检查之后也是如此 鉴于:Typescript 显式类型检查后无法推断常量的类型?(TS2349:无法调用其类型缺少调用签名的表达式。),typescript,Typescript,我在TypeScript中遇到了一个奇怪的问题,似乎我应该能够推断出常量是数组,并利用这些知识调用数组方法。然而,TypeScript显然无法确定值是否确实是数组,即使在显式检查之后也是如此 鉴于: type Maybe<T> = T | null | undefined; type Value = string | number | string[] | number[] | Maybe<number | string>[]; 我觉得应该将上述内容简
type Maybe<T> = T | null | undefined;
type Value = string
| number
| string[]
| number[]
| Maybe<number | string>[];
我觉得应该将上述内容简化为:
// This approach results in an error:
const currVal: Maybe<Value> = perhapsSomeValueSomewhere;
const isListOfStrings = Array.isArray(currVal)
&& currVal.every((s) => typeof(s) === 'string');
// ... Do other stuff here
我只能假设这意味着,在这个过程中,TypeScript已经失去了上下文,通过&&currVal.every((s)=>…
这一点,currVal
确实是某种数组
当两位逻辑看起来相当相似时,为什么后者会导致错误?在第一种情况下,您通过将currVal赋值给任何[]来强制转换隐式类型,在第二种情况下,您没有将类型强制转换为数组类型。您可以使用以下显式强制转换来实现这一点
const isListOfStrings = Array.isArray(currVal) && (<Array<any>>currVal).every((s) => typeof (s) === 'string');
const isListOfStrings=Array.isArray(currVal)和&(currVal).every((s)=>typeof(s)==“string”);
感谢您的回复——将常量断言为arr:any[]有什么区别吗
并严格地强制转换它,这就是我认为我们在您的示例中所做的:currVal
。我的印象是前者提供了一些编译时安全性,而后者没有?我已经整理了答案中的术语,当您分配给任何[]如果发生了隐式强制转换,编译器将在已知赋值无效时发出警告,当您执行显式强制转换时,编译器也将在赋值无效时发出警告。代码示例的潜在问题是,不一定事先知道类型值,因此编译器不会发出警告。在由于&&运算符仅在第一个表达式为true时计算第二个表达式,因此运行时Array.isArray调用会保护您的示例的状态。感谢您的解释!
TS2349: Cannot invoke an expression whose type lacks a call signature. Type '((callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any) => boole...' has no compatible call signatures.
const isListOfStrings = Array.isArray(currVal) && (<Array<any>>currVal).every((s) => typeof (s) === 'string');