打字稿数组混淆 - TS 2488 类型为“从不”

Posted

技术标签:

【中文标题】打字稿数组混淆 - TS 2488 类型为“从不”【英文标题】:Typescript array confusion - TS 2488 with Type 'never' 【发布时间】:2020-05-02 14:40:42 【问题描述】:

它们是针对应用程序类型的 TS 2488 for 循环中的以下代码错误 - 当时的类型是 never?

如果我删除 if 中的第三个比较,Array.isArray(apps),那么 for 循环 (ILuisApp[]) 中的类型是正确的,而不是类型 never。

export interface ILuisFull 
    id: string;
    name: string;
    description: string;
    culture: string;
    versionsCount: number;
    app_createdDateTime: string;
    endpointHitsCount: number;
    activeVersion: string;
    tokenizerVersion: string;
  
  export interface ILuisApp 
    id: string;
    name: string;
    description: string;
    culture: string;
    usageScenario: string;
    domain: string;
    versionsCount: number;
    createdDateTime: string;
    endpointHitsCount: number;
    activeVersion: string;
    ownerEmail?: string;
    tokenizerVersion: string;
  

export const transform = (apps: ILuisApp[]): ILuisFull[] => 

    if (!apps || apps.length === 0 || Array.isArray(apps)) return [] as ILuisFull[];

    let fullTable: Array<ILuisFull> = [];

    // apps is type never unless remove 3rd comparison in if above
    for (var val of apps) 
        console.log(val);
      
    return fullTable;

ts 配置包括:

"target": "es5",
"module": "commonjs",
"lib": [
  "es2016",
  "es2017.object",
  "esnext.asynciterable"
],

【问题讨论】:

【参考方案1】:

编译器似乎认为apps 未初始化。它认为arrnull。所以它说:

类型 'never' 必须有一个 'Symbol.iterator' 方法,该方法返回一个 迭代器。

但是,可以使用强制转换apps as ILuisApp[]) 来说明apps 的类型:

for (let val of apps as ILuisApp[]) 
    console.log(val);

【讨论】:

以上是关于打字稿数组混淆 - TS 2488 类型为“从不”的主要内容,如果未能解决你的问题,请参考以下文章

打字稿错误 TS2345 错误:TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数

打字稿:错误 TS2693:“承诺”仅指一种类型,但在此处用作值

查找累积和反应打字稿

打字稿 - 类型'值:数字;日期:日期; ' 不可分配给类型 'Record[]'。 ts(2322)

如何在打字稿中定义一个常量数组

数组中的展开操作出错。 TS1005:“,”预期。打字稿