Javascript 函数来测试变量类型还是抛出类型脚本?

Javascript 函数来测试变量类型还是抛出类型脚本?,javascript,typescript,Javascript,Typescript,我希望有一个函数来测试类变量是否不为null,并在后续函数调用中使用它。但是有人抱怨。封装这个validate函数,因为我需要在许多方法中调用它 class A { point: Point | null validatePoint() { if (!this.point) throw new Error() } update(p: Point | null) { this.validatePoint() // ts complains this.poi

我希望有一个函数来测试类变量是否不为null,并在后续函数调用中使用它。但是有人抱怨。封装这个validate函数,因为我需要在许多方法中调用它

class A {
  point: Point | null
  validatePoint() {
    if (!this.point) throw new Error()
  }

  update(p: Point | null) {
    this.validatePoint()
    // ts complains this.point can be null
    doSomething(this.point)
  }
}

应该使用ifthis.point==null语句显式检查null。尽管我认为不需要单独的方法,但这似乎有点过分。

您应该使用ifthis.point===null语句显式检查null。尽管我认为您不需要单独的方法,但这似乎有点过分。

一个选项是使用类型保护,并使用更新而不是validatePoint:

但对类似的事情使用单独的方法似乎有点过分:

update(p: Point | null) {
    if (this.point === null) {
        throw new Error();
    }
    doSomething(this.point);
}
如果必须将其放在单独的函数中,则validatePoint的另一个选项是返回已验证点,因为这类内容不能用于缩小父对象IIRC的类型:

class A {
    point: Point | null;
    validatePoint() {
        if (this.point === null) {
            throw new Error();
        }
        return this.point;
    }
    update(p: Point | null) {
        const validatedPoint = this.validatePoint();
        doSomething(validatedPoint);
    }
}

一个选项是使用类型保护,并插入更新而不是validatePoint:

但对类似的事情使用单独的方法似乎有点过分:

update(p: Point | null) {
    if (this.point === null) {
        throw new Error();
    }
    doSomething(this.point);
}
如果必须将其放在单独的函数中,则validatePoint的另一个选项是返回已验证点,因为这类内容不能用于缩小父对象IIRC的类型:

class A {
    point: Point | null;
    validatePoint() {
        if (this.point === null) {
            throw new Error();
        }
        return this.point;
    }
    update(p: Point | null) {
        const validatedPoint = this.validatePoint();
        doSomething(validatedPoint);
    }
}
在更新中,验证this.point是否为null

如果this.point为null,则会引发错误,并且不会调用doSomething。 如果this.point不为null,则表示this.point为点类型

因此,调用doSomething时,this.point不可能为null。这就是TS这样抱怨的原因。

在更新中,您验证this.point是否为null

如果this.point为null,则会引发错误,并且不会调用doSomething。 如果this.point不为null,则表示this.point为点类型

因此,调用doSomething时,this.point不可能为null。这就是TS如此抱怨的原因。

Typescript 3.7介绍:

Typescript 3.7介绍了:



在运行时,您所说的是正确的。调用doSomething时,this.point不可能为null。但是TS抱怨,因为它认为这个点可以为空。这就是为什么我想告诉ts编译器is不能为null。是的,但我需要在我所有的调用函数中使用它,这违反了我在一个函数中封装的想法。你所说的在运行时是正确的。调用doSomething时,this.point不可能为null。但是TS抱怨,因为它认为这个点可以为空。这就是为什么我想告诉ts编译器是不能为null的。是的,但我需要在所有调用函数中使用它,这违反了我在一个函数中封装的想法。我正在寻找ts指令,让它知道点不能为null。我有许多函数调用validatePoint,否则我就不需要将其封装到函数中。谢谢!向上投票选择一个有效的方法,如果这是TS功能列表的路线图,仍然在寻找一个方向。我正在寻找一个TS指令,让它知道点不能为空。我有许多函数调用validatePoint,否则我就不需要将其封装到函数中。谢谢!为一个有效的方法投票,如果这是在TS功能列表的路线图中,仍然在寻找一个方向。我有很多方法需要验证点。这就是为什么我想让它成为一个函数。我有很多方法需要验证点。这就是为什么我想让它成为一个函数。这太棒了!我在操场上试过,效果很好,但不知怎么的,在我的地方我找不到名字。我的ts版本是3.7.2。错误来自typescript编译器还是其他地方?e、 ide,eslintit来自ide。我还试图开玩笑地运行它,但得到了意外的令牌,这是意料之中的{关于这个函数谢谢!我最终得到了一个不同的实现。请投票选择一个有效的方法。这太棒了!我在操场上试过它,它工作得很好,但不知怎的,在我的本地我找不到名称断言。我的ts版本是3.7.2。错误来自typescript编译器或其他地方?例如ide,eslintit来自ide。我也我开玩笑地运行了它,得到了意想不到的令牌,期望{关于这个函数谢谢!我最终得到了一个不同的实现。投票赞成一个有效的方法。