Я не уверен, как это сформулировать, но я получаю странное поведение компилятора Typescript, когда в некоторых случаях использую интерфейс.
Например, это отлично работает, как задумано. Ни ошибки компилятора, ничего.
interface Bar {
letter: 'a' | 'b';
}
declare class Foo {
constructor(bars: Bar[]);
}
const foo = new Foo([
{
"letter": "a"
},
{
"letter": "b"
}
]);
Но если я добавлю ненужный параметр в один из Bar
, как здесь:
const foo = new Foo([
{
"letter": "a"
},
{
"letter": "b"
"what": 175875,
}
]);
Затем компилятор выдает эту неожиданную ошибку в обе моих letter
параметров:
Type 'string' is not assignable to type '"a" | "b"'.
Я что-то упустил или это какая-то проблема с компилятором?
это не ошибка компилятора, так было начиная с TypeScript 1.6, см. это: Критические изменения | Строгая проверка присваивания литерала объекта
вам нужно сообщить typescript, что интерфейс может иметь больше таких свойств:
interface Bar {
letter: 'a' | 'b';
[x: string]: any;
}
По сути, вы говорите ему, что передаете массив
Bar
, но затем передаете что-то в массиве, не являющеесяBar
, поэтому TypeScript жалуется на весь массив.