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

ziv*_*ziv 5 typescript

第三方库中有功能扩展对象以向其添加更多功能.例如,无缝不可变的

我想为这样的库创建定义文件.我想到了一些东西

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>
Run Code Online (Sandbox Code Playgroud)

然后我将能够声明我自己的类型:

interface Type1 {prop1, prop2}
interface Type2 {propOfType1: ImmutableMethods<Type1>}
var immutableType2:Type2 = Immutable(...)
Run Code Online (Sandbox Code Playgroud)

然后我将在所有对象上使用Immutable函数.

但问题是该行interface ImmutableMethods<T> extends T给了我一个错误"一个接口可能只扩展一个类或另一个接口"

有没有办法声明T是一个接口,还是一种其他方式来获得这种扩展行为?

Paa*_*rth 2

您可以使用交叉类型来实现此行为。为额外的函数定义一个接口,并定义一个类型 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 = ...;
Run Code Online (Sandbox Code Playgroud)

接口ImmutableMethods<T>定义了所涉及的功能。类型ImmutableExtended<T>是我们实际想要用于扩展对象的接口,当然您可以随意命名这些接口。