代码是:

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

我得到以下TS错误:

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

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


当前回答

在使用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);

其他回答

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

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

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

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

你也可以添加字符串[]

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

当它是物体的一部分时,我就这么做了

let complexObj = {
arrData : [],
anotherKey: anotherValue
...
}
(arrData as string[]).push('text')

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

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

// Example: type of useState is an array of string
const [items , setItems] = useState<string[]>([]); 

在最新版本的angular中,你必须定义变量的类型:

如果它是一个字符串,你必须这样做: 公开信息:string =""; 如果是数字: 公共n: number=0; 如果一个string的表: 公共标签:字符串[]= []; 如果用数字表表示: 公共标签:number[]=[]; 如果是混合表: 公共标签:any[] = []; ……Etc(用于其他类型的变量) 如果你没有定义变量的类型:默认情况下,类型为never

注意:在你的情况下,你必须知道你的表必须包含的变量类型,并选择正确的选项(如选项3,4,5)。