我正在try 弄清楚如何将类型保护与非参数变量一起使用.实际的场景是一个类的属性,但我try 用块外的变量来简化它.

let x: string | undefined

function fn() {
    setX()
    x.toLowerCase() // x might be undefined
}
function setX() {
    x = "foo"
}

更适用的示例:

class FooWidget {

    private el: Element | undefined

    public display() {
        this.createElementIfNotExists()
        this.el.classList.add("display") // this.el possibly undefined
    }

    private createElementIfNotExists() {
        if (this.el) return
        this.el = document.createElement("div")
        document.body.appendChild(this.el)
    }
}

推荐答案

您的createElementIfNotExists()方法不返回值,但是在调用它之后,el属性的类型应该是Element而不是Element | undefined.这意味着您可以将其转换为assertion method,其中narrows是调用它的对象的外观类型.断言方法具有表单asserts this is ⋯的返回类型.

这里有一种方法:

  protected el: Element | undefined // can't be private

  private createElementIfNotExists(): asserts this is { el: Element } {
    if (this.el) return
    this.el = document.createElement("div")
    document.body.appendChild(this.el)
  }

一旦调用this.createElementIfNotExists(),this就会缩小到this & {el: Element},这足以让您的代码开始工作:

  public display() {
    this.createElementIfNotExists()
    this.el.classList.add("display") // okay
  }

请注意,要执行此操作,el属性不能为private(请参见microsoft/TypeScript#49709).没有办法写asserts this.el is Element,而类型{el: Element}以一种与private属性不兼容的方式暗示public.然而,你can就变成了protected.

Playground link to code

Typescript相关问答推荐

映射类型中和映射类型之间的通用变量推断

如何获取数组所有可能的索引作为数字联合类型?

类型脚本不会推断键的值类型

React router 6.22.3不只是在生产模式下显示,为什么?

当使用`type B = A`时,B的类型显示为A.为什么当`type B = A时显示为`any `|用A代替?

如何为父类构造函数中的修饰属性赋值?

单击并移除for循环中的一项也会影响另一项

如何正确地对类型脚本泛型进行限制

泛型类型,引用其具有不同类型的属性之一

Angular 错误NG0303在Angular 项目中使用app.Component.html中的NGFor

如何使用函数填充对象?

如何使用泛型自动推断TS中的类型

未在DIST中正确编译TypeScrip src模块导入

ANGLE找不到辅助‘路由出口’的路由路径

如何在Typescript 中组合unions ?

找不到财产的标准方式?

扩展对象的此内容(&Q;)

有没有一种更好的方法来存储内存中的数据,而不是在类型脚本中使用数组和基于索引的函数?

如何填写Partial的一些属性并让类型系统知道它?

我可以使用对象属性的名称作为对象中的字符串值吗?