代码是:

const foo = (foo: string) => {
  const result = []
  result.push(foo)
}

我得到以下TS错误:

string类型的实参不能赋值给never类型的形参。

我做错了什么?这是一个bug吗?


当前回答

const foo = (foo: string) => {
  const result: string[] = []
  result.push(foo)
}

您需要指定数组是什么,因为result =[]的返回类型为任意[]。通常情况下,你想要避免任何类型,因为根据微软的说法,它们意味着被用作“逃生舱口”。

结果是一个字符串数组的对象。

其他回答

从"compilerOptions"中删除"strictNullChecks": true或在tsconfig中将其设置为false。这些错误会像任何东西一样消失,你的应用程序将成功编译。

免责声明:这只是一个变通方案。此错误仅在null检查未正确处理时出现,这在任何情况下都不是完成工作的好方法。

我能够通过使用Array关键字而不是空括号来解决这个问题:

const enhancers: Array<any> = [];

使用:

if (typeof devToolsExtension === 'function') {
  enhancers.push(devToolsExtension())
}

另一种方法是:

const result: any[] = [];

在使用ReactJS Hook时,我在ReactJS无状态函数中出现了同样的错误 useState。 我想设置一个对象数组的状态,如果我用下面的方法

const [items , setItems] = useState([]);

并像这样更新状态:

 const item = { id : new Date().getTime() , text : 'New Text' };
 setItems([ item , ...items ]);

我得到了错误: 类型为'{id: number;any}'不能赋值给类型为'never'的形参

但如果这样做,

const [items , setItems] = useState([{}]);

错误消失了,但有一个项目在0索引没有任何数据(不想要)。

所以我找到的解决方案是:

const [items , setItems] = useState([] as any);

我得到的错误时定义(初始化)一个数组如下:

let mainMenu: menuObjectInterface[] | [] = [];

我得到的问题的代码:

let mainMenu: menuObjectInterface[] | [] = [];
dbresult.rows.forEach((m) => {
    if (!mainMenu.find((e) => e.menucode === m.menucode)) {
        // Not found in mainMenu, yet
        mainMenu.push({menucode: m.menucode, menudescription: m.menudescription})  // Here the error
    }
})

错误是:TS2322:类型“any”不能赋值给类型“never”

原因是数组初始化时也选择了空数组。 Typescript看到了一个push到类型,该类型也可以为空。因此出现了错误。

将行改为这样修正了错误:

let mainMenu: menuObjectInterface[] = [];