作为函数但也具有属性的Typescript类

时间:2016-11-02 14:17:09

标签: typescript

是否可以实现以下界面:

export interface Foo {
    (): void;

    bar: number;
}

使用课程?

这是我能想到的最接近的事情:

var foo = function () { } as Foo;

foo.bar = 5;

3 个答案:

答案 0 :(得分:1)

虽然我不完全确定,但我认为使用没有严重黑客攻击的课程是不可能的。我认为这种接口语法实际上是用于支持外部库类型,在许多情况下存在这样的结构。

您在示例代码中实际引用的是static个成员。我的意思是一个带有公共构造函数的类和一些静态成员正是这种结构。但是静态成员不能在接口中声明(显然)。

答案 1 :(得分:1)

你不能让一个类这样做,但你可以使用类型别名和交集类型来做这样的事情:

// Define the type of your objects
type Foo = { (): void } & { bar: number };

// You could have a factory method to create instances
var fooFactoryMethod = (func: () => void, bar: number) => {
  var foo = func as Foo;
  foo.bar = bar;
  return foo;
}   

var myObject = fooFactoryMethod(() => { console.log("Hello world") }, 23)

// Or just creating them manually
var myObject2 = (() => { console.log("Hello world") }) as Foo;
myObject2.bar = 45;

// Now you can use it like this
var func = (arg: Foo) => {
  arg();
  arg.bar = 34;
}
func(myObject)

Playground

答案 2 :(得分:0)

所有类在编译成js时都是函数。

export class FooClass implements Foo {
    bar: number;

    constructor() {
        this.bar = 1;
    }

}