Typescript 类型脚本类是函数,但也有属性

Typescript 类型脚本类是函数,但也有属性,typescript,Typescript,是否可以实现以下接口: export interface Foo { (): void; bar: number; } 使用课堂 这是我能想到的最接近的事情: var foo = function () { } as Foo; foo.bar = 5; 虽然我不能完全确定,但我认为如果没有一些严重的黑客攻击,使用类是不可能的。我认为这种接口语法实际上是为了支持外部库类型,在很多情况下,这种结构是存在的 您在示例代码中实际引用的是类的静态成员。我的意思是,一个具有公共构造函

是否可以实现以下接口:

export interface Foo {
    (): void;

    bar: number;
}
使用课堂

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

var foo = function () { } as Foo;

foo.bar = 5;

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


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

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

export class FooClass implements Foo {
    bar: number;

    constructor() {
        this.bar = 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)

决定某件事是否可能的最好方法是去尝试。如果你仔细想想。。这就是类编译的目的;)也。在我的回答中,我假设您真正想要的是实现该接口的对象,而不一定是类。是这样吗?我正在寻找最干净的解决方案。不过模块的行为与类不同。@user3233089当然,但您需要在这里使用类吗?您的用例是什么?我需要使用特定于类的属性:例如创建的多个实例。@user3233089有帮助吗?