在将大量文件转换为打字稿时,我有许多这样声明的类。
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
这显然是设计使然。注释最好的方法,在我看来,是定义类型FooClass
和FooConstructor
提前:
interface FooClass {
bar: number;
myMethod(): void;
}
interface FooConstructor {
new(): FooClass,
prototype: FooClass
}
请注意,当使用class FooClass {}
创建构造函数的方式时,TypeScript会自动生成一个值 FooClass
(即构造函数本身)和一个类型( FooClass
即由构造函数创建的实例的类型)。这通常会使开发人员感到困惑,因此请当心。我们在这里手动进行操作:上面interface FooClass
是我们要创建的type,而不是value。
在定义了这些类型之后,在创建FooClass
函数FooConstructor
时断言该函数是类型的(断言需要通过Function
或any
并且不安全,因此要小心)。
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] 删除。
我来说两句