Выполнение функции периодически в скрученном протоколе

TLDR : это ожидаемое поведение в TypeScript из-за того, как работает проверка избыточного свойства .

В вашем случае определенная вами функция стрелки имеет тип возвращаемого значения, который имеет избыточные (или дополнительные) свойства. Для TypeScript это совершенно нормально.

В упрощенном примере, посмотрите на это поведение:

type a = () => { a: string };
type b = () => { a: string, b: string };

declare let myA: a;
declare let myB: b;

myA = myB; // OK! (excess properties are not checked)
myB = myA; // Error: missing required property 'b'

Суть вашей проблемы в том, что вы по существу присваиваете myB для myA и ожидаете ошибка, но вы получите ошибку только при назначении myA для myB.

У вас есть несколько вариантов, чтобы заставить ваш код работать должным образом (например, тот, который вы предложили, где вы явно определяете тип возвращаемого значения), но ни один из них не идеален, пока TypeScript не поддерживает точный types (есть открытая проблема для точных типов, которая обсуждает ваш точный вариант использования с редукцией и некоторые обходные пути).

24
задан Amit 24 November 2008 в 22:21
поделиться

2 ответа

Вы, вероятно, хотели бы сделать это на Фабрике для соединений. Фабрика автоматически не уведомляется относительно каждого раза, когда связь установлена и потеряна, таким образом, можно уведомить его из Протокола.

Вот полный пример того, как использовать twisted.internet.task. LoopingCall в сочетании со специализированной основной Фабрикой и Протоколом, чтобы объявить, что '10 секунд передавал' каждому соединению каждые 10 секунд.

from twisted.internet import reactor, protocol, task

class MyProtocol(protocol.Protocol):
    def connectionMade(self):
        self.factory.clientConnectionMade(self)
    def connectionLost(self, reason):
        self.factory.clientConnectionLost(self)

class MyFactory(protocol.Factory):
    protocol = MyProtocol
    def __init__(self):
        self.clients = []
        self.lc = task.LoopingCall(self.announce)
        self.lc.start(10)

    def announce(self):
        for client in self.clients:
            client.transport.write("10 seconds has passed\n")

    def clientConnectionMade(self, client):
        self.clients.append(client)

    def clientConnectionLost(self, client):
        self.clients.remove(client)

myfactory = MyFactory()
reactor.listenTCP(9000, myfactory)
reactor.run()
38
ответ дан 28 November 2019 в 23:37
поделиться

Я вообразил бы самый легкий способ сделать, который должен управлять списком клиентов в протоколе с connectionMade и connectionLost в клиенте и затем использовать LoopingCall, чтобы попросить, чтобы каждый клиент отправил данные.

, Который чувствует себя немного агрессивным, но я не думаю, что Вы хотели бы сделать это без протокола, имеющего некоторый контроль над передачей/приемом. Конечно, я должен был бы видеть Ваш код, чтобы действительно знать, как он впишется хорошо. Получил ссылку GitHub?:)

3
ответ дан 28 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: