首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在类公共函数和类变量上使用typeguards

如何在类公共函数和类变量上使用typeguards
EN

Stack Overflow用户
提问于 2020-07-21 17:45:50
回答 1查看 27关注 0票数 0

假设下面的验证器类

代码语言:javascript
复制
class Validator<T> {
  private readonly data: T;

  public constructor(data: T) {
    this.data = data;
  }

  public isDefined(): this.data is NonNullable<T> { // This is invalid
    return typeof this.data !== 'undefined';
  }
}

我正在尝试弄清楚如何在this.data的isDefined函数中添加不可为空的typeguard。上面的示例是无效的,并且在this.data中出现以下错误

代码语言:javascript
复制
(property) Validator<T>.data: T
Duplicate identifier 'data'.ts(2300)
All declarations of 'data' must have identical modifiers.ts(2687)
Subsequent property declarations must have the same type.  Property 'data' must be of type 'T', but here has type 'any'.ts(2717)
validation.ts(11, 20): 'data' was also declared here.

我计划在下面这样的场景中使用它:

代码语言:javascript
复制
const myNumber: number | undefined = 1234;

if (new Validator(myNumber).isDefined()) {
  console.log(myNumber) // Typescript should only see this as number
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-21 18:17:38

只有在引用validator.data而不是引用外部作用域中的自由变量时,它才会起作用。

代码语言:javascript
复制
class Validator<T> {
  constructor(readonly data: T) {}

  isDefined(): this is Validator<NonNullable<T>> {
    return (
      this.data !== null && this.data !== undefined
    );
  }
}

declare const myNumber: number | undefined;

const validator = new Validator(myNumber);

if (validator.isDefined()) {
  validator.data;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63011751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档