代码是:
const foo = (foo: string) => {
const result = []
result.push(foo)
}
Run Code Online (Sandbox Code Playgroud)
我收到以下TS错误:
[ts]类型'string'的参数不能分配给'never'类型的参数.
我究竟做错了什么?这是一个错误吗?
Tha*_*uni 103
您所要做的就是将您定义result为字符串数组,如下所示:
const result : string[] = [];
Run Code Online (Sandbox Code Playgroud)
nei*_*iya 33
我在 ReactJS 函数组件中遇到了同样的错误,使用 ReactJS useState 钩子。
解决方案是在初始化时使用尖括号声明 useState 的类型:
// Example: type of useState is an array of string
const [items , setItems] = useState<string[]>([]);
Run Code Online (Sandbox Code Playgroud)
Sha*_*hah 30
const foo = (foo: string) => {
const result: string[] = []
result.push(foo)
}
Run Code Online (Sandbox Code Playgroud)
您需要指定数组是什么,因为result = []返回类型为any[]。通常,您希望避免使用any类型,因为根据 Microsoft 的说法,它们旨在用作“逃生舱口”。
结果是一个对象,它是 的数组string。
Lak*_*chi 23
我找到的解决方案是
const [files, setFiles] = useState([] as any);
Run Code Online (Sandbox Code Playgroud)
ImF*_*had 19
在使用 ReactJs Hook useState时,我在ReactJS statless 函数中 遇到了同样的错误。我想设置对象数组的状态,所以如果我使用以下方式
const [items , setItems] = useState([]);
Run Code Online (Sandbox Code Playgroud)
并像这样更新状态:
const item = { id : new Date().getTime() , text : 'New Text' };
setItems([ item , ...items ]);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
'{ id: number; 类型的参数; 文本:任何 }' 都不能分配给类型为 'never' 的参数
但如果这样做,
const [items , setItems] = useState([{}]);
Run Code Online (Sandbox Code Playgroud)
错误消失了,但索引为0的项目没有任何数据(不想要)。
所以我找到的解决方案是:
const [items , setItems] = useState([] as any);
Run Code Online (Sandbox Code Playgroud)
roh*_*095 12
错误:“any”类型的参数不可分配给“never”类型的参数。
在 tsconfig.json 中 -
"noImplicitReturns": false,
"strictNullChecks":false,
Run Code Online (Sandbox Code Playgroud)
解决方案:输入“从不”
我能够通过使用 Array 关键字而不是空括号来解决这个问题:
const enhancers: Array<any> = [];
Run Code Online (Sandbox Code Playgroud)
用:
if (typeof devToolsExtension === 'function') {
enhancers.push(devToolsExtension())
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是:
const result = [] as any;
Run Code Online (Sandbox Code Playgroud)
小智 6
从“compilerOptions”中删除“strictNullChecks”:true ,或在Ng 应用程序的tsconfig.json文件中将其设置为 false 。这些错误将会像任何事情一样消失,并且您的应用程序将成功编译。
免责声明:这只是一种解决方法。仅当空检查未正确处理时才会出现此错误,这在任何情况下都不是完成任务的好方法。
这似乎是最近的回归或打字稿中有些奇怪的行为。如果您有代码:
const result = []
Run Code Online (Sandbox Code Playgroud)
通常,您将其视为:
const result:any[] = []
Run Code Online (Sandbox Code Playgroud)
但是,如果您的tsconfig中同时具有noImplicitAnyFALSE和AND strictNullChecks TRUE,则将其视为:
const result:never[] = []
Run Code Online (Sandbox Code Playgroud)
这种行为违抗所有逻辑,恕我直言。启用空检查会更改数组的条目类型?然后开启noImplicitAny实际上会恢复使用,any而不会发出任何警告?
当您真正拥有的数组时any,您无需使用额外的代码进行指示。
导致该错误的又一个原因。
如果您在使用 connect()() 包装组件后导出,则 props 可能会给出打字稿错误
解决方案:我没有进行太多探索,因为我可以选择用 useSelector 钩子替换 connect
函数
/* 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} />
}
Run Code Online (Sandbox Code Playgroud)
我在定义(初始化)数组时遇到错误,如下所示:
let mainMenu: menuObjectInterface[] | [] = [];
Run Code Online (Sandbox Code Playgroud)
我遇到问题的代码:
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
}
})
Run Code Online (Sandbox Code Playgroud)
错误是:TS2322:类型“any”不可分配给类型“never”
原因是该数组也是使用空数组选项进行初始化的。Typescript 看到了对也可以为空的类型的推送。因此出现了错误。
将行更改为此修复了错误:
let mainMenu: menuObjectInterface[] = [];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57397 次 |
| 最近记录: |