如何在TypeScript中引用旧式构造函数的实例类型?

时间:2018-09-12 09:12:33

标签: 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接口,但是当您有很多属性时,这绝对不是您想要的。然后也要使功能原型和接口保持同步也不会带来很多乐趣。你不觉得吗?

4 个答案:

答案 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文件中的老式类声明的类型信息。