TypeScript 无法在扩展语法函数调用中推断数组类型
Posted
技术标签:
【中文标题】TypeScript 无法在扩展语法函数调用中推断数组类型【英文标题】:TypeScript cannot infer array type in spread syntax function call 【发布时间】:2020-07-28 20:05:58 【问题描述】:我可以毫无问题地将数组作为函数/构造函数参数传播:(test.js)
class Person
name;
age;
constructor(name, age)
this.name = name;
this.age = age;
let a = ['Claire', 8];
let p = new Person(...a);
console.log(p);
但是,同样的事情在 TypeScript 中不起作用:(test.ts)
class Person
constructor(
public name: string,
public age: number
)
let a = ['Claire', 8];
let p = new Person(...a); // Error: An argument for 'name' was not provided.
console.log(p);
这是 TypeScript 中的错误吗?它无法弄清楚如何在这里使用传播语法。是否有解决方法或者我必须手动分配每个单独的参数?
【问题讨论】:
【参考方案1】:选项 1:
let a: [string, number] = ['Claire', 8];
选项 2:
let a = ['Claire', 8] as const;
这将告诉 TypeScript 将 a
视为包含 'Claire'
作为其第一项和 8
作为其第二项的元组,这符合 [string, number]
。没有as const
a
被视为(string | number)[]
。
【讨论】:
这和声明为const a = ['Claire', 8]
有什么不同
@bryan60 javascript 结果会一样,TypeScript 会区别对待
@bryan60 const a =
在这种情况下只会告诉你不会为这个变量重新分配任何值,它不会影响类型。【参考方案2】:
非常感谢!现在我明白错误是由于类型不兼容造成的。以下代码有效(test.ts)
class Person
constructor(
public name: string,
public age: number
)
/* Spell out type or use 'as const' both work!
Or TypeScript treats ['Claire', 8] as of type (string | number)[]*/
let a: [string, number] = ['Claire', 8];
let b = ['Liam', 11] as const;
let p1 = new Person(...a);
let p2 = new Person(...b);
console.log(p1, p2);
【讨论】:
以上是关于TypeScript 无法在扩展语法函数调用中推断数组类型的主要内容,如果未能解决你的问题,请参考以下文章