Typescript: создать файл объявлений с различными типами от реализации? - PullRequest
0 голосов
/ 20 декабря 2018

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

// source brewery.ts
function brewBeer(name: unknown): Beer { ... }

// emitted brewery.d.ts
declare function brewBeer(name: string): Beer;

«Зачем вам это нужно?»

Я пишу библиотеку на TypeScript, которую я ожидаю использовать и в другихПроекты TypeScript.По этой причине я проверяю во время выполнения действительность параметров, передаваемых в открытые функции, например:

export function brewBeer(name: string): Beer {
  if (typeof name !== 'string') {
    throw new TypeError(`'${name}' is not a beer name.`);
  }
  // Continue brewing...
}

Этот подход применим, но не совершенен:

  1. Я не могу выполнить модульное тестирование поведения при передаче неверного типа параметров, поскольку, поскольку тестовые файлы также находятся в TypeScript, тесты даже не будут выполняться, если ограничения типа не выполнены:

    TS2345: Аргументтип 'число' не может быть назначен параметру типа 'строка'.

  2. Компилятор, конечно, не обеспечивает проверку параметров во время компиляции.

На первый взгляд обе проблемы можно решить с помощью типа unknown top:

  1. Я мог передать любой тип параметра в моих тестах для оценкиповедение во время выполнения.
  2. Компилятор помогает путем принудительного определения параметров функции перед их вычислением.

Однако этот подход также имеет недостатки, так как испускаемое объявление wouЭто будет выглядеть так:

// brewery.d.ts
declare function brewBeer(name: unknown): Beer;

, что было бы бесполезно в проектах, использующих TypeScript.

Итак, есть ли способ использовать unknown и по-прежнему создавать объявленияфайлы с «правильными» типами без их ручной корректировки?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Использование any приведений в вашем тесте или // @ts-ignore:

brewBeer(<any>42);
// @ts-ignore
brewBeer(42);

Поскольку @ts-ignore влияет на всю строку (например, вы могли бы напечатать brewBeer), я быпредпочитаю метод any.

0 голосов
/ 20 декабря 2018

Можно ли поручить компилятору TypeScript выдавать файлы объявлений с другими типами, чем те, которые использовались в реализации.

Простой ответ: нет.

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