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 无法在扩展语法函数调用中推断数组类型的主要内容,如果未能解决你的问题,请参考以下文章

Typescript编译器无法从Promise resolve调用中推断类型

TypeScript中函数组合方法(链)的类型推断

typescript 从子类调用的构造函数参数推断类型

Typescript:使用装饰器时的类型推断

TypeScript 中的类型推断在特殊用例中无法正常工作

在 TypeScript 中,如何在具有多个类型参数的方法中推断出泛型类型参数?