Почему не получается создать тип Object[] в typescript?
У меня есть простой код
class A<T extends Object[]> {
public B: T = [{ a: 1 }, { b: 2 }];
}
Но выходит ошибка
Тип "({ a: number; } | { b: number; })[]" не может быть назначен для типа "T". "({ a: number; } | { b: number; })[]" может быть назначен ограничению типа "T", но можно > создать экземпляр "T" с другим подтипом ограничения "Object".ts(2322)
Как это исправить?
Ответы (1 шт):
Потому что у класса есть универсальный параметр, который будет установлен при инициализации экземпляра.
И соответственно тип T, станет тем, чем его назначил пользователь.
А ты решил самовольно определить структуру(пока неизвестного) объекта.
Это означает, что если пользователь создаст такой класс:
class A<T extends object[]> {
public B: T = [{ a: 1 }, { b: 2 }]
}
const foo = new A<{foo: 'bar'}[]>()
... то тип {foo: 'bar'} конфликтует с твоим { a: 1 }|{ b: 2 } самовольным определением.
Такой пример может выглядеть примерно так:
type TItem = {
a: number
b: number
}
class A<T extends TItem & object> {
public B: Pick<T, 'a' | 'b'>[] = [ { a: 1 , b: 2 }, { a: 3, b: 3 }]
}
// Теперь пользователь обязан передать тип который может использовать класс:
const foo = new A<TItem & {foo: 'bar'}>()
// Но свойство конкретно возвращает выборку свойств:
foo.B
// => {a: number, b: number}[]