如何为扩展对象的函数创建typescript定义

如何为扩展对象的函数创建typescript定义,typescript,Typescript,第三方库中有一些函数可以扩展对象以向其添加更多函数。e、 g 我想为这样一个库创建定义文件。我认为这是一种 interface ImmutableMethods<T> extends T{ set?<U>(key: string | number, value: any): T | U; setIn?<U>(keys: Array<string>, value: any): T | U; ... } function Imm

第三方库中有一些函数可以扩展对象以向其添加更多函数。e、 g

我想为这样一个库创建定义文件。我认为这是一种

interface ImmutableMethods<T> extends T{
    set?<U>(key: string | number, value: any): T | U;
    setIn?<U>(keys: Array<string>, value: any): T | U;
    ...
}
function Immutable<T>(obj: T, options?): ImmutableMethods<T>
接口不可变方法扩展了{
设置?(键:字符串|数字,值:任意):T | U;
setIn?(键:数组,值:任意):T | U;
...
}
函数不可变(obj:T,options?):不可变方法
然后,我可以将自己的类型声明为:

interface Type1 {prop1, prop2}
interface Type2 {propOfType1: ImmutableMethods<Type1>}
var immutableType2:Type2 = Immutable(...)
接口类型1{prop1,prop2}
接口类型2{propOfType1:ImmutableMethods}
变量immutableType2:Type2=不可变(…)
然后我将在所有对象上使用不可变函数

但问题是,
interface ImmutableMethods extends T
行给了我一个错误“一个接口只能扩展一个类或另一个接口”


有没有一种方法可以声明T是一个接口,或者有一种完全不同的方法来获得这种扩展行为

可以使用交叉点类型来实现此行为。定义额外函数的接口,并定义T&interface类型。我对代码的修改:

interface ImmutableMethods<T> {
    set?<U>(key: string | number, value: any): T | U;
    setIn?<U>(keys: Array<string>, value: any): T | U;
}
type ImmutableExtended<T> = ImmutableMethods<T> & T;

interface Type1 { prop1: string, prop2: string }
interface Type2 { propOfType1: ImmutableExtended<Type1> }
var immutableType2: Type2 = ...;
接口不可变方法{
设置?(键:字符串|数字,值:任意):T | U;
setIn?(键:数组,值:任意):T | U;
}
类型ImmutableExtended=ImmutableMethods&T;
接口类型1{prop1:string,prop2:string}
接口类型2{propOfType1:ImmutableExtended}
变量immutableType2:Type2=。。。;

ImmutableMethods
接口定义了所涉及的函数。
ImmutableExtended
类型是我们实际希望用于扩展对象的接口,当然您可以随意命名这些接口。

我不明白您为什么要在接口上使用
Extendes t
。你不能从
不可变的
扩展吗?我不想把我的业务逻辑接口与我正在使用的库的实现细节结合起来。另一件事是需要传递数组和映射,因此我需要以某种方式创建一种新的数组对象,而不仅仅是编写x:ImmutableMethods。仅供参考,我在无缝不可变repo上发布了一个关于类型的问题: