TypeScript не может определить тип массива при вызове функции расширенного синтаксиса - PullRequest
2 голосов
/ 15 апреля 2020

Я могу без проблем распространять массив в качестве аргументов функции / конструктора: (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? Он не может понять, как использовать синтаксис распространения здесь. Есть ли обходной путь или мне нужно вручную назначать каждый отдельный аргумент?

Ответы [ 2 ]

4 голосов
/ 15 апреля 2020

Опция 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)[].

0 голосов
/ 15 апреля 2020

Спасибо большое! Теперь я понимаю, что ошибка связана с несовместимостью типов. Следующий код работает (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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...