【问题标题】:TypeScript cannot infer array type in spread syntax function callTypeScript 无法在扩展语法函数调用中推断数组类型
【发布时间】: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 中的错误吗?它无法弄清楚如何在这里使用传播语法。是否有解决方法或者我必须手动分配每个单独的参数?

【问题讨论】:

    标签: javascript arrays typescript spread-syntax


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多