是否可以指示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类型解决:
但是这种方法也有缺陷,因为发出的声明看起来像这样:
// brewery.d.ts
declare function brewBeer(name: unknown): Beer;
在使用TypeScript的项目中几乎没有效用。
因此,有没有一种方法可以使用unknown
并仍然发出具有“正确”类型的声明文件,而无需手动对其进行纠正?
答案 0 :(得分:1)
是否可以指示TypeScript编译器发出声明类型与实现中使用的类型不同的声明文件。
简单答案:否。
答案 1 :(得分:1)
在测试或any
中使用// @ts-ignore
强制转换:
brewBeer(<any>42);
// @ts-ignore
brewBeer(42);
由于@ts-ignore
影响整行(例如,您可能会拼写brewBeer
),所以我更喜欢any
方法。