如何通过函数作为类型注释使用旧样式类声明
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
接口,但是当您有很多属性时,这绝对不是您想要的。然后也要使功能原型和接口保持同步也不会带来很多乐趣。你不觉得吗?
答案 0 :(得分: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);
答案 1 :(得分:1)
function Foo() { }
Foo.prototype.bar = 'bar'
interface Foo {
new(): {
bar: string
}
}
let x: InstanceType<Foo>
我认为唯一的解决方案是定义Foo
的接口。我不知道TypeScript是否可以正确推断分配给原型的内容。
答案 2 :(得分:0)
只需确保:您希望x
是一个新功能,还是调用一个的结果?对于前者,您可能需要手册中的Module Augmentation部分。对于后者,也许您真正想要的是:
class Foo {
bar = 'bar'
}
declare let x: Foo;
console.log(x.bar)
答案 3 :(得分:0)
如果您将旧类放在.js
文件中并启用allowJs
编译器选项,则TypeScript将分析{{ 1}}构造函数以及this
属性的赋值,并为Foo
提供一个返回类型。那仍然没有定义Foo.prototype
类型。为此,您可以执行以下操作:
new Foo()
(我从here中学到了这个技巧,尽管我不知道它是不是它的起源。)
我不认为有任何方法可以获取出现在Foo
文件中的老式类声明的类型信息。