打字稿数组混淆 - 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 类型为“从不”的主要内容,如果未能解决你的问题,请参考以下文章