繁体   English   中英

如何在 JavaScript/VSCode/TypeScript 中声明 setter 的类型?

[英]How to declare the type of a setter in JavaScript/VSCode/TypeScript?

我有一个非常简单的例子来演示这个问题:

class Person {
    _name = '';
    _age  = 0;
    get name() {
        return this._name;
    }
    /**
     * @type {string}
     */
    set name(name) {
        this._name = name;
    }
    get age() {
        return this._age;
    }
    /**
     * @type {number | string}
     */
    set age(age) {
        if (age === 'too old') {
            age = 100000;
        }
        this._age = age;
    }
}

我使用 VSCode 进行类型检查,但为什么它会在类型上失败?

我明确地说年龄设置器可以采用数字或字符串:

在此处输入图像描述

您没有定义类型,而是写了一个 JSDoc 注释。 这实际上不会影响您的代码。 因此 TypeScript 隐式设置类型number

如果您希望 setter 同时接受stringnumber一个解决方案,则可以使用这样的联合类型:

set age(age: string | number) {
   ...
}

请记住,稍后设置this._age时会出现问题,因为this._age也隐式具有类型number (默认值0 ),因此不能分配类型为string | number的值。 string | number

我相信您需要将联合类型用括号括起来才能在 JSDoc 中有效:

/**
* @type {(number | string)}
*/

文档中:

多种类型(联合类型) 这可以是数字或 boolean。{(number|boolean)} 这意味着一个值可以具有多种类型之一,整个类型列表用括号括起来并用 | 分隔。

以下代码段应该可以工作。 只需使用typeof检查age的类型,即可将类型缩小为if语句。

class Person {
  _name = '';
  _age  = 0;
  get name() {
      return this._name;
  }
  /**
   * @param {string} name
   */
  set name(name) {
      this._name = name;
  }
  get age() {
      return this._age;
  }
  /**
   * @param {number | string} age
   */
  set age(age) {
      if (typeof age === 'string') {
        if (age === 'too old') {
          age = 100000;
        } else {
          age = parseInt(age)
        }
      }
      this._age = age;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM