Использование шаблона объекта-компаньона в TypeScript с флагом tsconfig noImplicitAny - PullRequest
0 голосов
/ 06 ноября 2019

Из книги (программирование TypeScript, написанной Борисом Черным) я читал об использовании шаблона Companion Object в машинописи. Это означает, что у вас есть тип и объект-значение с одинаковым именем, а объект-значение используется для инициализации экземпляра типа. Реализация его с собственной ссылкой в ​​части значения шаблона означает, что часть значения имеет тип any. Например (из книги):

type Currency = {
  unit: 'EUR' | 'GBP' | 'JPY' | 'USD';
  value: number;
};

let Currency = {
  DEFAULT: 'USD',
  from(value: number, unit = Currency.DEFAULT): Currency {
    return { unit, value };
  }
};

В этом примере значение «Валюта» и параметр «единица измерения» имеют тип any. Исправить единицу достаточно просто.

let Currency = {
  DEFAULT: 'USD',
  from(value: number, unit: Currency['unit'] = Currency.DEFAULT): Currency {
    return { unit, value };
  }
};

Но как насчет значения «Валюта», которое неявно имеет тип «any» и не может быть сужено до «as const»? (Я пробовал это) Мне просто интересно, что лучше в этом сценарии, конечно, я мог бы явно объявить тип Валюты любого типа, я мог бы также избежать самоссылки, как это:

let Currency = {
  from(value: number, unit: Currency['unit'] = 'USD'): Currency {
    return { unit, value };
  }
};

Но я думаю, что в некоторых случаях вам действительно может понадобиться собственная ссылка, например, если вы хотите указать значение по умолчанию, например, глубоко вложенный тип объекта. Какой стиль самый лучший?

...