如何在两个类之间共享TypeScript函数定义?

如何在两个类之间共享TypeScript函数定义?,typescript,.d.ts,Typescript,.d.ts,在TypeScript声明文件(.d.ts)中声明类时,可以向其中添加如下函数: declare class Foo { myFunction (arg1: number, arg2: string): void; } 但是,如果您希望在另一个类中有一个具有相同签名的函数,该怎么办?当然,您可以复制并粘贴该行,但也可以使用type定义该行,并多次重用该类型: declare class Foo { myFunction: MyFunctionFn; } declare class B

在TypeScript声明文件(
.d.ts
)中声明类时,可以向其中添加如下函数:

declare class Foo {
  myFunction (arg1: number, arg2: string): void;
}
但是,如果您希望在另一个类中有一个具有相同签名的函数,该怎么办?当然,您可以复制并粘贴该行,但也可以使用
type
定义该行,并多次重用该类型:

declare class Foo {
  myFunction: MyFunctionFn;
}

declare class Bar {
  myFunction: MyFunctionFn;
}

type MyFunctionFn = (arg1: number, arg2: string) => void;
问题在于VS代码和其他编辑器如何在自动完成期间呈现函数。下面是显示以下声明的示例:

declare class Foo {
  sharedFn: SharedFn;
  inlineFn (arg1: number, arg2: string): void; 
}

type SharedFn = (arg1: number, arg2: string) => void; 

如您所见,
inlineFn
正确地显示为一个方法,而
sharedFn
显示为一个属性(在本例中,恰好为其分配了一个函数值)


在TypeScript中有没有一种方法可以让它显示为一个正确的方法,但仍然与其他类共享函数签名?

我不确定为什么要创建
.d.ts
文件。如果使用类,将自动声明类型

如果希望类共享方法签名,可以使用接口。现在您将获得更好的智能感知:

interface Foo {
    myFunction: (arg1: number, arg2: string) => void;
}

class Bar implements Foo {
    myFunction(arg1: number, arg2: string){

    }
}

let c = new Bar()
c.myFunction(2, "hi")

没有适合你的完美解决方案。这是一个中间解决方案,它的重复性比键入所有参数本身要小,但不如所需的方法注释好:

type MyFunctionFn = (arg1: number, arg2: string) => void;

declare class Foo {
  myFunction(...args: Parameters<MyFunctionFn>): ReturnType<MyFunctionFn>;
}

declare class Bar {
  myFunction(...args: Parameters<MyFunctionFn>): ReturnType<MyFunctionFn>;
}
type MyFunctionFn=(arg1:number,arg2:string)=>void;
声明类Foo{
myFunction(…参数:参数):ReturnType;
}
声明类栏{
myFunction(…参数:参数):ReturnType;
}

有关更多详细信息,请参阅。

如果要将类型添加到用JavaScript而不是TypeScript编码的模块中,则手动创建
.d.ts
文件非常有用。在本机编码TypeScript时,如果需要从接口对要实现的函数体进行编码,则实现接口非常有用。但在本例中,我将向JavaScript模块添加类型,我的目标是不必编写两次该方法,在这种情况下,实现接口实际上会迫使我将方法签名键入N+1次