javascript - 分配时不强制执行 Typescript 字段类型

标签 javascript typescript

我有一个设置_device值的构造函数,该字段的类型为number,构造函数参数的类型为number,如下出色地。

但是当字符串传递给构造函数时,它会将该字符串分配给字段(数字类型)。

除了严格检查传入参数的类型以确保它是数字之外,我不确定还能尝试什么,我宁愿让 Typescript 处理这个问题。

我认为我的问题是 socketio 参数是如何进来的。 是否允许声明这样的类型?

{
joinRoom: { 
          roomId: string, 
          intent: number
        }, 
        playerData: { 
          name: string,
          device: number
        }
}

玩家等级

export class Player {
  private _name: string;
  private _socketId: string;
  private _isReady: boolean;
  private team: string;
  private _device: number;

 /**
  * Creates an instance of Player.
  * @param {string} name
  * @param {string} socketId
  * @param {number} device
  * @memberof Player
  */
  constructor(name: string, socketId: string, device: number) {
    this._name = name;
    this._isReady = false;
    this._socketId = socketId;
    this._device = device;
  }
...

RoomLogic 类

/**
   * @private
   * @param {*} socket
   * @memberof RoomLogic
   */
  private joinRoom(socket: any) {
    socket.on(CONSTANTS.JOIN_ROOM, 
      (
        joinRoom: { 
          roomId: string, 
          intent: number
        }, 
        playerData: { 
          name: string,
          device: number
        }
      ) => {

      const noRooms = this.utils.isObjectEmpty(this._rooms);
      const roomAlreadyExists = !this.utils.isUndefined(this._rooms[joinRoom.roomId]);
      const isValid = this.isPlayerDataValid(playerData);

      if (isValid.isSuccessful === false) {
        return socket.emit(CONSTANTS.JOIN_ROOM, isValid);
      }

      if (this.utils.isSame(joinRoom.intent, JoinRoomIntents.CreateNewRoom)) {

        // should never be hit, but keep in case
        if (roomAlreadyExists) {
          return socket.emit(CONSTANTS.JOIN_ROOM, {
            isSuccessful: false,
            value: `room with id: ${joinRoom.roomId} already exists`
          });
        }

        let player = new Player(playerData.name, socket.id, playerData.device);
...

我期望发生的是 Typescript 捕获此错误并在编译时或运行时抛出某种错误。

最佳答案

TypeScript 不执行运行时检查。事实上你已经告诉了它

playerData: { 
  name: string,
  device: number
}

允许 TypeScript 在编译时检查类型 playerData.device 是否与构造函数的 device 参数的预期类型匹配,它确实这样做了。如果您不相信传入的数据与您给出的类型声明相匹配,则还需要执行运行时检查。

关于javascript - 分配时不强制执行 Typescript 字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56509740/

相关文章:

javascript - Mongodb 聚合移动平均线计算

javascript - 忽略数组中区分大小写的输入?

javascript - AngularJS 和 Mongo DB 页面请求 **更新**

angular - Firebase Firestore get() 不工作

angular - 将字符串转换为 typescript 中的对象?

angular - Ionic 3 输入百分比掩模

javascript - xmlHttpRequest 状态 = 0

javascript - 如果子字符串不在正则表达式中,则将其括在双引号中

javascript - 在 VueJs 中将元素从代码隐藏渲染到 v-html

javascript - Promise 不在 Typescript 中编译