Typescript 如何使用环境声明使类型更严格?
假设我使用的包具有以下类型的文件:Typescript 如何使用环境声明使类型更严格?,typescript,types,Typescript,Types,假设我使用的包具有以下类型的文件: lib.foobar.d.ts declare function foobar(foo: string): void; declare function foobar(foo: 'bar'): void; declare foobar(foo: 'bar'): void; declare foobar(foo: string): never; 现在假设lib.foobar.d.ts是为早期版本的Typescript编写的,该版本不支持文字类型。实际上,f
lib.foobar.d.ts
declare function foobar(foo: string): void;
declare function foobar(foo: 'bar'): void;
declare foobar(foo: 'bar'): void;
declare foobar(foo: string): never;
现在假设lib.foobar.d.ts
是为早期版本的Typescript编写的,该版本不支持文字类型。实际上,foobar
函数实际上要求foo
参数完全是'bar'
,而不是其他字符串。我可以为此编写环境声明:
ext.foobar.d.ts
declare function foobar(foo: string): void;
declare function foobar(foo: 'bar'): void;
declare foobar(foo: 'bar'): void;
declare foobar(foo: string): never;
Typescript现在知道foobar(foo:bar')
是foobar
函数的有效重载,但它只是一个重载,foobar(foo:string)
版本仍然是合法的。因此,如果我写foobar('baz')
,我不会得到任何错误,但我希望这是一个错误,因为它必须是foobar('bar')
是否有任何方法可以在不编辑lib.foobar.d.ts
的情况下删除或更正原始foobar
声明的情况下执行此操作
我能做到的最接近的是:
ext.foobar.d.ts
declare function foobar(foo: string): void;
declare function foobar(foo: 'bar'): void;
declare foobar(foo: 'bar'): void;
declare foobar(foo: string): never;
这导致foobar('baz')
行之后的行有时被标记为无法访问的代码。显然,如果foobar('baz')
是块中的最后一行,则不会有任何其他行无法访问。有时似乎只是出于某种原因?我觉得还不够好
(在我的实际用例中,我想要更新的函数在lib.dom.d.ts
中,我想要使用的更严格的类型是项目的“品牌原语”,比如Pixels
或其他什么,所以像“向foobar
提交拉取请求修复声明”这样的东西是行不通的。)