如何使旧样式类在打字稿中工作?

史蒂夫·哈诺夫

在将大量文件转换为打字稿时,我有许多这样声明的类。

function FooClass() {
    this.bar = 1; // error TS2683: 'this' implicitly has type 'any'
                  // because it does not have a type annotation.
}

FooClass.prototype.myMethod = function() {
    // ...
}

如何避免启用严格的类型检查,而又避免使用类语法将其全部重写呢?

贾卡尔兹

使上述代码正常工作的最简单方法是向函数添加this参数,如下所示:

function FooClass(this: {bar: number}) {
    this.bar = 1; // okay
}

不幸的是,FooClass当您将其视为构造函数时,您很快就会发现编译器不知道该怎么做

const oops = new FooClass(); // error, oops is implicitly any
oops.bar // okay but compiler has no idea
oops.myMethod() // okay but also no idea
oops.foo // also okay, but you probably don't want it to be
oops.yourMethod() // ditto

这显然是设计使然注释最好的方法,在我看来,是定义类型FooClassFooConstructor提前:

interface FooClass {
  bar: number;
  myMethod(): void;
}

interface FooConstructor {
  new(): FooClass,
  prototype: FooClass
}

请注意,当使用class FooClass {}创建构造函数方式时,TypeScript会自动生成一个 FooClass(即构造函数本身)和一个类型( FooClass即由构造函数创建的实例的类型)。这通常会使开发人员感到困惑,因此请当心。我们在这里手动进行操作:上面interface FooClass我们要创建type,而不是value

在定义了这些类型之后,在创建FooClass函数FooConstructor断言该函数是类型的(断言需要通过Functionany并且不安全,因此要小心)。

const FooClass = function FooClass(this: FooClass) {
  this.bar = 1;
} as Function as FooConstructor;

FooClass.prototype.myMethod = function () {
  // ...
}

并测试一下:

const okay = new FooClass();
okay.bar // number
okay.myMethod() // known
okay.foo // error, yay
okay.yourMethod() // error, yay

希望能有所帮助;祝好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章