Почему не получается создать тип 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 шт):

Автор решения: Alexander Lonberg

Потому что у класса есть универсальный параметр, который будет установлен при инициализации экземпляра. И соответственно тип 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}[]
→ Ссылка