我在我的Typescript项目中使用immutable.js
,它为其某些方法提供了错误的声明。例如,Indexed<T>
方法get
被声明为返回T
,但实际上它返回T | undefined
,我想在我自己的项目中修改该类型,以便我可以使用它而不必分叉immutable.js。
我尝试将其放在其中一个模块中(不是环境.d.ts,因为我了解到显然你不能增加第三方接口,除非你在一个模块中)。
declare module 'immutable' {
export interface Iterable<K, V> {
get(key: K, notSetValue?: V): V | undefined;
}
export interface Indexed<T> extends Iterable<number, T> {
get(index: number, notSetValue?: T): T | undefined;
}
}
(索引扩展了Iterable,它提供了类似的get
方法,所以我不得不扩展它。)
这是我在尝试此代码时遇到的错误:
ERROR in c:\...\node_modules\immutable\dist\immutable-nonambient.d.ts
(1260,22): error TS2320: Interface 'Indexed<T>' cannot simultaneously extend types 'Seq<number, T>' and 'Indexed<T>'.
Named property 'get' of types 'Seq<number, T>' and 'Indexed<T>' are not identical.
ERROR in c:\...\node_modules\immutable\dist\immutable-nonambient.d.ts
(2486,22): error TS2320: Interface 'Indexed<T>' cannot simultaneously extend types 'Collection<number, T>' and 'Indexed<T>'.
Named property 'get' of types 'Collection<number, T>' and 'Indexed<T>' are not identical.
这些错误让我感到困惑,因为Collection和Seq没有明确地在immutable.d.ts文件中声明get
方法 - 它们只是扩展了Iterable。
有趣的是,我做在我调用get()
并且没有处理undefined
的其他代码中出现类型错误,所以看起来就像打字稿了我正在修改不可变模块的声明并在其他地方应用这些规则;我只是无法将此声明本身编译,因为它似乎与统一原始的Iterable声明相混淆。