Typescript:发出与实现类型不同的声明文件?

时间:2018-12-19 23:39:53

标签: typescript typescript-declarations

是否可以指示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. 编译器通过在求和之前强制执行功能参数的断言来提供帮助。

但是这种方法也有缺陷,因为发出的声明看起来像这样:

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

在使用TypeScript的项目中几乎没有效用。

因此,有没有一种方法可以使用unknown并仍然发出具有“正确”类型的声明文件,而无需手动对其进行纠正?

2 个答案:

答案 0 :(得分:1)

  

是否可以指示TypeScript编译器发出声明类型与实现中使用的类型不同的声明文件。

简单答案:否。

答案 1 :(得分:1)

在测试或any中使用// @ts-ignore强制转换:

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

由于@ts-ignore影响整行(例如,您可能会拼写brewBeer),所以我更喜欢any方法。