在 TypeScript 中如何引用旧式构造函数的实例类型?
如何通过函数作为类型注解使用旧式类声明
function Foo () {}
Foo.prototype.bar = 'bar';
let x:Foo;
console.log(x.bar);
不幸的是,我们不能写“let x:Foo”,因为 TypeScript 会报错:
[ts] 找不到名称 'Foo'。
我尝试了其他方式:
function Foo () {}
Foo.prototype.bar = 'bar';
declare type FooType = typeof Foo
let x:FooType;
但是 x 那时是函数,而不是 Foo 的实例。TypeScript 也有 InstanceType<T> 泛型,但同样——我们不能使用 Foo,因为 Foo 不是类型注解。
有没有解决方法可以像使用 Foo 这样的类函数一样,将原型用作类型注解?
编辑
当然,我们可以按照答案中的建议,额外创建一个包含所有复制粘贴属性的 IFoo 接口,但当你有大量属性时,这显然不是你想要做的。然后,为了保持函数原型和接口同步,也会不是很有趣。你不这样认为吗?
答案#1
我会这样做:
// Use to specify the properties on your final object
interface IFoo {
bar: string;
}
// Class Definition
function Foo() { };
Foo.prototype.bar = 'bar';
// Use it
let x:IFoo = new Foo();
console.log(x.bar);
答案#2
function Foo() { }
Foo.prototype.bar = 'bar'
interface Foo {
new(): {
bar: string
}
}
let x: InstanceType<Foo>
我认为唯一的解决方案是定义一个 Foo 接口。我不知道 TypeScript 是否能够正确推断分配给 prototype 的内容。
