【问题标题】:Typescript interface accepts wrong typeTypescript 接口接受错误的类型
【发布时间】:2019-04-27 12:44:18
【问题描述】:

我是 Typescript 的新手。我被困在接口部分。使用 Nodejs,我将一个对象从客户端发送到名为 startData 的服务器。该对象包含一个 ID 和用户名。我正在使用接口来定义此对象中的类型。我将 testId 定义为数字,将 Username 定义为字符串。

但是,例如,当我将 testId 作为字符串发送并将用户名作为对象发送时,不会引发任何错误。为什么接口接受错误的类型?我希望它会引发某种意外的类型错误。

interface startDataInterface{
    testId: number;
    username: string;
}

socket.on('startData', function(startData: startDataInterface) {
   ...

我在客户端发送这个:

socket.emit('startData', {testId: "string", username: {}});

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    socket方法on只接受泛型函数,所以typescript在接收端不会报错。如果您需要那种程度的类型检查,请扩展或委托套接字并编写类型安全的包装器。

    【讨论】:

      【解决方案2】:

      您可能正在扩展 EventEmitter,默认情况下它具有 any,因为它是 emit 参数。

      任何时候使用any,都会禁用有效的类型检查。默认情况下,发出的内容与on 捕获的内容之间也没有任何关系。

      可以通过重载创建非常具体的onemit 方法。例如,您可以这样定义 emit 方法:

      emit: function(eventName: 'startData', startData: StartDataInterface);
      emit: function(eventName: string...args: any) {
      }
      

      使用这样的签名,typescript 将知道如何为 startData 事件强制执行这些类型,但您还必须在 on 方法上添加相同类型的重载签名。

      【讨论】:

      • 对不起,我不明白。你为什么在这里使用两个发射函数来捕获一条消息?
      • @P.Yntema 它们不是 2 个函数。这是一个具有多个重载定义的函数。看看官方文档(在这个页面搜索重载)typescriptlang.org/docs/handbook/functions.html
      猜你喜欢
      • 2022-12-06
      • 2016-02-22
      • 2022-09-28
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2021-10-27
      相关资源
      最近更新 更多