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

问题描述 投票:2回答:2

在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显示为一个属性(在这种情况下恰好被赋予一个函数值)。

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

typescript .d.ts
2个回答
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


0
投票

我不确定你为什么要创建一个.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")

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.