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

时间:2019-03-17 14:35:26

标签: typescript .d.ts

在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 Code和其他编辑器在自动完成期间如何呈现功能。以下是显示以下声明的示例:

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

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

enter image description here

如您所见,inlineFn被正确显示为方法,而sharedFn被显示为属性(在这种情况下,恰好被分配了一个函数值)。 / p>

TypeScript中是否可以将其显示为适当的方法,但仍与其他类共享函数签名?

2 个答案:

答案 0 :(得分:1)

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

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>;
}

有关更多详细信息,请参见this answer

答案 1 :(得分:0)

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

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

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")

enter image description here