В Typescript вы можете реализовать один и тот же интерфейс generi c дважды с разными типами generi c? - PullRequest
0 голосов
/ 08 января 2020

Я попытаюсь объяснить мою ситуацию на примере.

Допустим, у меня есть интерфейс:

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

Я получил бы ошибку "Duplicate identifier 'listen'".

Исправьте меня, если я ошибаюсь, но я полагаю (вообще говоря), что класс должен быть в состоянии реализовать один и тот же универсальный интерфейс c несколько раз с разными типами, поскольку он может реализовывать различное поведение для каждого аргумента типа.

Реализация одной и той же концепции в C#, кажется, работает так, как я намеревался работать, но я знаю, что C# более "осведомлен о типах" во время выполнения, чем Typescript (или JavaScript в этом отношении).

И поэтому я спрашиваю, как вы думаете, я должен go об этом?

Заранее спасибо!

1 Ответ

0 голосов
/ 08 января 2020

Я новичок в дженериках в машинописи, так что, возможно, это неправильно ... Но мне кажется, вам не нужны два разных определения дженериков c:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...