首页 > 解决方案 > 在 Typescript 中,你可以用不同的泛型类型两次实现相同的泛型接口吗?

问题描述

我将尝试用一个例子来解释我的情况。

说我有界面:

interface EventListener<TArgs> {
    listen: () => TArgs
}

实施:

class Foo implements EventListener<UserConnectedArgs>, EventListener<UserDisconnectedArgs> {
    listen = (): UserConnectedArgs => {
        // user connection detection logic
    }
    listen = (): UserDisconnectedArgs => {
        // user disconnection detection logic
    }
}

以及用法:

const userConnectionListener: EventListener<UserConnectedArgs> = new Foo()
const userDisconnectionListener: EventListener<UserDisconnectedArgs> = new Foo()

我会收到“重复的标识符‘听’”错误。

如果我错了,请纠正我,但我相信(一般来说)一个类应该能够使用不同的类型多次实现相同的通用接口,因为它可以为每个类型参数实现不同的行为。

在 C# 中实现相同的概念似乎按照我想要的方式工作,但我知道 C# 在运行时比 Typescript(或 JavaScript)更“类型感知”。

所以我问,你认为我应该怎么做?

提前致谢!

标签: typescriptoop

解决方案


我是打字稿中的泛型新手,所以也许这是错误的......但对我来说,您似乎不需要两个不同的泛型定义:

interface EventListener<Args> {
    listen: () => Args
}

使用不同类型 args 的类

class Foo implements EventListener<Args> {
    listen() : Args {
        // the returned "something" value will have type Args
        return something
    }
}

用法

const userConnectionListener: EventListener<UserConnectedArgs> = new Foo()
const userDisconnectionListener: EventListener<UserDisconnectedArgs> = new Foo()


userConnectionListener.listen()      // will return data of type UserConnectedArgs
userDisconnectionListener.listen()   // will return data of type UserDisconnectedArgs

推荐阅读