Обобщение машинописи для массива - PullRequest
1 голос
/ 14 апреля 2020

мне нужно, чтобы шаблон c массива был расширен из моего класса. Как это сделать правильно?

export interface DeliveryMethod {
  readonly id: string;
  readonly company: string;
  readonly cost: number;
  readonly threshold: number;
  readonly intervals: Array<Interval>;
  readonly paymentMethods: Array<PaymentMethod>;
}

export interface Delivery {
  selected: SelectedDelivery;
  available: { [key : string] : Array<T extends DeliveryMethod>};
}

Невозможно найти имя 'T'.ts (2304)

available: { [key : string] : Array<T extends DeliveryMethod>};

Например, мне нужно что-то подобное:

const Delivery = {
   selected :{/*data inside*/},
   available:{
      pickup: [<Pickup>{},<Pickup>{}],
      courier: [<Courier>{},<Courier>{}]  
   }
}

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Ответ @aopanasenko в порядке. Я хочу завершить его, добавив способ решения проблемы нескольких спецификаций.

Если свойства available невелики, а они фиксированы и стабильны, то вы можете подумать о перечислении их всех. в интерфейсе Delivery:

interface Delivery<T extends DeliveryMethod, U extends DeliveryMethod> {
  available: { [key : string] : Array<T | U>};
};

Затем вы можете определить объект delivery следующим образом:

const delivery: Delivery<Pickup, Courier>

Если вы не знаете свойства априори, тогда вы Мне нужен способ связать имя свойства с типом TypeScript, например, я добавил объект available только для отображения:

interface Delivery {
  available: { [key: string]: Array<DeliveryMethod> | null };
};

const delivery: Delivery = {
  available: {}
}

const available: {
  pickup: Pickup[] | null,
  courier: Courier[] | null
} = {
  pickup: null,
  courier: null
};

delivery.available = { ...delivery.available, ...available };

Таким образом, он правильно проверен на тип. Я также добавил | null, чтобы привести пример, вы можете удалить его.

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

Обновление

Как упомянуто @AndreaSimoneCosta в комментарии, следующий код должен работать:

export interface DeliveryMethod {
  readonly id: string;
  readonly company: string;
  readonly cost: number;
  readonly threshold: number;
  readonly intervals: Array<Interval>;
  readonly paymentMethods: Array<PaymentMethod>;
};

export interface Delivery<T extends DeliveryMethod = DeliveryMethod> {
  selected: SelectedDelivery;
  available: { 
    [key : string] : Array<T>
  };
};

Вы должны определить список параметров типа c в угловых скобках после имени интерфейса Delivery:

export interface DeliveryMethod {
  readonly id: string;
  readonly company: string;
  readonly cost: number;
  readonly threshold: number;
  readonly intervals: Array<Interval>;
  readonly paymentMethods: Array<PaymentMethod>;
};

export interface Delivery<T extends DeliveryMethod> {
  selected: SelectedDelivery;
  available: { 
    [key : string] : Array<T>
  };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...