代码是:

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

我得到以下TS错误:

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

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


当前回答

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

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[] = [];

其他回答

你所要做的就是将结果定义为一个字符串数组,如下所示:

const result : string[] = [];

如果没有定义数组类型,默认情况下将为never。因此,当您尝试向它添加字符串时,它是类型不匹配,因此抛出您所看到的错误。

我在React函数组件中得到了相同的错误,使用useState钩子。

解决方案是在初始化时使用尖括号声明useState的类型:

// Example: type of useState is an array of string
const [items , setItems] = useState<string[]>([]); 
const foo = (foo: string) => {
  const result: string[] = []
  result.push(foo)
}

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

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

你需要输入result到字符串const result的数组:string[] =[];。

当您在没有设置对象属性的情况下设置对象中的属性值时,会发生此错误。声明带有属性的对象类型,然后在实例化对象时分配该类型。现在您可以设置属性值而不会出现此错误。