Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 显式类型检查后无法推断常量的类型?(TS2349:无法调用其类型缺少调用签名的表达式。)_Typescript - Fatal编程技术网

Typescript 显式类型检查后无法推断常量的类型?(TS2349:无法调用其类型缺少调用签名的表达式。)

Typescript 显式类型检查后无法推断常量的类型?(TS2349:无法调用其类型缺少调用签名的表达式。),typescript,Typescript,我在TypeScript中遇到了一个奇怪的问题,似乎我应该能够推断出常量是数组,并利用这些知识调用数组方法。然而,TypeScript显然无法确定值是否确实是数组,即使在显式检查之后也是如此 鉴于: type Maybe<T> = T | null | undefined; type Value = string | number | string[] | number[] | Maybe<number | string>[]; 我觉得应该将上述内容简

我在TypeScript中遇到了一个奇怪的问题,似乎我应该能够推断出常量是数组,并利用这些知识调用数组方法。然而,TypeScript显然无法确定值是否确实是数组,即使在显式检查之后也是如此

鉴于:

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