不能赋值给类型为never的参数是什么?TypeScript错误?

代码是:

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

我得到以下TS错误:

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

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

827469 次浏览

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

const result : string[] = [];

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

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

另一种方法是:

const result: any[] = [];

这似乎是typescript中一些奇怪的行为,因为遗留的原因而被困住了。如果你有代码:

const result = []

通常你会这样写:

const result:any[] = []

然而,如果你在你的tsconfig中同时设置了noImplicitAny FALSE, strictNullChecks TRUE,它将被视为:

const result:never[] = []

恕我直言,这种行为完全不合逻辑。打开空检查改变数组的条目类型??然后打开noImplicitAny实际上恢复使用any没有任何警告??

当你真的有一个any的数组时,你不需要用额外的代码来指明它。

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

const enhancers: Array<any> = [];

使用:

if (typeof devToolsExtension === 'function') {
enhancers.push(devToolsExtension())
}
在使用ReactJs Hook时,我在ReactJS无状态函数中有相同的错误 # EYZ0。 我想要设置一个对象数组的状态,所以如果我使用以下方式

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

并像这样更新状态:

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

我得到错误:

类型为'{id: number;Text: any}'不能赋值给类型为'never'的参数

但如果这样做,

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

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

# EYZ0 < br >

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

< em > " compilerOptions " < / em >中删除< em >“strictNullChecks”:真正的< / em >,或者在你的Ng应用的< em > tsconfig.json < / em >文件中将其设置为false。这些错误会像任何事情一样消失,你的应用将成功编译。

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

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

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

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

我找到的解决办法是

const [files, setFiles] = useState([] as any);
< p > # EYZ0

解决方案:我没有探索太多,因为我可以选择用useSelector钩子替换连接函数 例如
< / p >
/* Comp.tsx */
interface IComp {
a: number
}


const Comp = ({a}:IComp) => <div>{a}</div>


/* **


below line is culprit, you are exporting default the return
value of Connect and there is no types added to that return
value of that connect()(Comp)


** */


export default connect()(Comp)




--
/* App.tsx */
const App = () => {
/**  below line gives same error
[ts] Argument of type 'number' is not assignable to
parameter of type 'never' */
return <Comp a={3} />
}

错误:“any”类型的实参不能赋值给“never”类型的形参。

在tsconfig。json -

  "noImplicitReturns": false,


"strictNullChecks":false,

enter image description here

解决方案:输入'never'

enter image description here

你也可以添加as string[]

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

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

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

您需要指定数组是什么,因为result = []的返回类型是any[]。通常情况下,你要避免使用any类型,因为它们是用来作为“Escape hatch”的。微软表示。

结果是一个对象,该对象是一个string数组。

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

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

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

  1. 如果它是一个字符串,你必须这样做:

    公众信息:string ="";

  2. 如果是数字

    :

    公共n: number=0;

  3. 如果是字符串表:

    公共标签:字符串[]= [];

  4. 如果是一个数字表:

    公共标签:number[]=[];

  5. 如果是混合表:

    public tab: any[] = []; ……Etc(对于其他类型的变量)

  6. 如果你没有定义变量的类型:默认情况下,类型是never

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