Можно ли поручить компилятору 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...
}
Этот подход применим, но не совершенен:
Я не могу выполнить модульное тестирование поведения при передаче неверного типа параметров, поскольку, поскольку тестовые файлы также находятся в TypeScript, тесты даже не будут выполняться, если ограничения типа не выполнены:
TS2345: Аргументтип 'число' не может быть назначен параметру типа 'строка'.
Компилятор, конечно, не обеспечивает проверку параметров во время компиляции.
На первый взгляд обе проблемы можно решить с помощью типа unknown
top:
- Я мог передать любой тип параметра в моих тестах для оценкиповедение во время выполнения.
- Компилятор помогает путем принудительного определения параметров функции перед их вычислением.
Однако этот подход также имеет недостатки, так как испускаемое объявление wouЭто будет выглядеть так:
// brewery.d.ts
declare function brewBeer(name: unknown): Beer;
, что было бы бесполезно в проектах, использующих TypeScript.
Итак, есть ли способ использовать unknown
и по-прежнему создавать объявленияфайлы с «правильными» типами без их ручной корректировки?