当前位置: 首页 > 知识库问答 >
问题:

如何使类在Typescript中实现调用签名?

东郭宏朗
2023-03-14

我在打字稿中定义了以下接口

interface MyInterface {
    () : string;
}

这个接口只是引入了一个不接受参数并返回字符串的调用签名。如何在类中实现这种类型?我尝试了以下操作:

class MyType implements MyInterface {
    function () : string {
        return "Hello World.";
    }
}

编译器一直告诉我

类“MyType”声明了接口“MyInterface”,但没有实现它:类型“MyInterface”需要调用签名,但类型“MyType”缺少调用签名

如何实现调用签名?

共有3个答案

施阎宝
2023-03-14

此答案中的代码示例假定以下声明:

var implementation: MyInterface;

作为对已接受答案的跟进,正如一些注释者所建议的那样,与接口的调用签名匹配的函数隐式实现接口。因此,您可以使用任何匹配函数作为实现。

例如:

implementation = () => "Hello";

您不需要显式指定函数实现接口。但是,如果您希望显式,可以使用强制转换:

implementation = <MyInterface>() => "Hello";

如果您想像通常使用Java或C#接口一样生成一个可重用的接口实现,只需将函数存储在消费者可以访问的地方。

例如:

function Greet() {
    return "Hello";
}

implementation = Greet;

您可能希望能够以与参数化类相同的方式参数化实现。这是执行此操作的一种方法:

function MakeGreeter(greeting: string) {
    return () => greeting;
}

implementation = MakeGreeter("Hello");

如果希望结果被类型化为接口,只需显式设置返回类型或强制转换返回的值。

乐正锦
2023-03-14

如果可调用接口应该有其他方法,您可以这样做:

interface Greeter {
    (): void;
    setName(name: string): void;
}

class ConsoleGreeter {

    private constructor( // constructable via `create()`
        private name = 'world'
    ) {}

    public call(): void {
        console.log(`Hello ${this.name}!`);
    }

    public setName(name: string) {
        this.name = name;
    }

    public static create(): Greeter {
        const instance = new ConsoleGreeter();
        return Object.assign(
            () => instance.call(),
            {
                setName: (name: string) => instance.setName(name)
                // ... forward other methods
            }
        );
    }
}

const greeter = ConsoleGreeter.create();
greeter(); // prints 'Hello world!'
greeter.setName('Dolly');
greeter(); // prints 'Hello Dolly!'

缺点:ConsoleGreeter的greeter实例false

章琛
2023-03-14

类无法与该接口匹配。我认为你能得到的最接近的就是这个类,它将生成功能上与接口匹配的代码(但不是根据编译器)。

class MyType implements MyInterface {
  constructor {
    return "Hello";
  }
}
alert(MyType());

这将生成工作代码,但编译器会抱怨 MyType 不可调用,因为它的签名 new() = 'string'(即使你用 new 调用它,它也会返回一个对象)。

要创建实际匹配接口而不让编译器抱怨的东西,你必须做这样的事情:

var MyType = (() : MyInterface => {
  return function() { 
    return "Hello"; 
  }
})();
alert(MyType());
 类似资料:
  • 怎样让联合类型,支持静态方法呀?

  • 我有一个Express API服务器应用程序和一个React客户端应用程序,都是用Typescript实现的。我使用TypeScript接口定义了我的数据模型,我在系统的两端都使用这些接口。但是,TypeScript接口只是编译时特性,我还需要运行时类型检查,例如验证HTTP POST数据(json)是否符合定义的数据结构。

  • 我有一个泛型类型,它将是事件系统中事件的基类。我们希望这些是单例,但它也是泛型的,以便子类可以在事件触发时指定它们在回调中期望的参数的类型。 我拥有的东西看起来像这样: 这里有些东西我认为很奇怪,主要是因为打字稿的语言要求。GetInstance的参数似乎是必要的,因为< code>var x = new TEvent()似乎不被TypeScript允许。空接口有助于加强什么可以被接受为泛型类型。

  • 这项规定就好像注册官或副注册官等获授权人士须以数码方式签署一份证明书。实现数字签名背后的基本思想是要知道: 1)证书是否由授权人数字签名,以及该授权人是谁,或者是谁创建了该证书,而该证书是由其他没有该授权的人创建的。 2)注册官/分注册官在证书上作数码签署(以停止伪造)后,证书是否有任何更改。 我已经搜索了很多关于这个话题,没有得到任何东西,甚至没有任何教程,可以指导我如何做到这一点。我从来没有听

  • 在一个个人项目中,我遇到了一个TypeScript条件类型的问题。我对TypeScript文档中的条件类型有基本的了解。我希望下面的设置工作,但它给出了一个类型错误。 基本上,我试图为从磁盘加载的树节点定义一个接口。这意味着,由于缺少文件等原因,某些节点可能无法正确加载。因此,任何节点实现都可能包含或。 我希望方法的实现可以返回,因为接口是通过类型扩展

  • 问题内容: 回调如何用PHP编写? 问题答案: 该手册可互换地使用术语“回调”和“可调用”,但是,“回调”传统上是指充当函数指针的字符串或数组值,并引用函数或类方法以供将来调用。自PHP 4以来,已经允许使用函数式编程的某些元素。 通常,这是使用可调用值的安全方法: 现代PHP版本允许上面的前三种格式直接作为调用。并支持以上所有内容。 注释/注意事项: 如果函数/类已命名空间,则字符串必须包含标准