Интерфейс Typescript Extend Generi c - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу создать интерфейс, с помощью которого я могу расширить любой тип машинописи, чтобы добавить свойство для расширения универсального c типа. Например, создайте тип Confidence<any>, который выглядит следующим образом:

export interface Confidence<T> extends T{
   confidenceLevel:number
}

Затем к нему можно получить доступ:

const date:Confidence<Date> = new Date();
date.confidenceLevel = .9;

Это не представляется возможным (и я чувствую, что это анти-паттерн), однако я могу сделать

export type Confidence<T> = T & {
   confidenceLevel:number
}

, что, кажется, достигло sh того, что я хочу сделать, хотя я чувствую, что я обманываю, делая это.

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

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Существует давний запрос функции, microsoft / TypeScript # 2225 , который запрашивает возможность сделать interface Foo<T> extends T {...} так, как вы этого просите. Это еще не реализовано (и может быть никогда). Прямо сейчас вы можете создать только интерфейс, extends тип объекта с статически известными ключами . Неуказанный параметр типа generi c T не работает, поскольку компилятор не может предсказать, какие ключи он будет иметь.

Вы должны быть уверены, что пересечение является разумным способом достижения этого (с оговоркой, что вы не будете предупреждены, если добавленное свойство вступает в конфликт со свойством T, так как вы заметили). Это предложенное решение в вышеупомянутом запросе функции. Кроме того, в наборе библиотеки TypeScript для Object.assign() используется пересечение для представления типа результата добавления свойств к существующему объекту. Следовательно, с Confidence<T>, определенным как

type Confidence<T> = T & {
  confidenceLevel: number
}

, вы можете легко написать функцию, которая производит одну из них, например:

function makeConfidence<T>(x: T, confidenceLevel: number): Confidence<T> {
  return Object.assign(x, { confidenceLevel });
}

, и использовать ее:

const x = makeConfidence(new Date(), 0.9); // x is a Confidence<Date>;
console.log(x.getFullYear()); // 2020
console.log(x.confidenceLevel); 0.9

Хорошо выглядит. Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

0 голосов
/ 25 февраля 2020

Ваш последний фрагмент кода является правильным способом сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...