3

在 JavaScript 中,我可以这样做:

function f() {}
f.prop = "property";

我想在 TypeScript 中使用它,但需要进行类型检查。

除了类,我可以使用什么 TypeScript 模式来强制函数获取属性?

我可以使用接口吗?

interface functionWithProperty {
    (): any;
    prop: string;
}

这似乎是 TypeScript 中的一个有效接口,但我如何实现这个接口,以便 TypeScript 编译器检查它prop的设置?

我看到了这个例子

var f : functionWithProperty = (() => {
    var _f : any = function () { };
    _f.prop = "blah";
    return _f;
}());

但这不起作用,因为我可以删除_f.prop = "blah";所有内容仍然可以编译。我需要执行prop设置。

4

2 回答 2

3

我认为您需要在 TypeScript 中接受面向对象并创建一个具有属性和函数的类。

像您在示例中那样组合函数和属性是有效的 JavaScript,但如果您正在跳入 TypeScript,您不妨完全沉浸在其中。

class MyClass {
    constructor(public myProp: string) {
    }

    myFunc(): string{
        return this.myProp;
    }
}

更新

免责声明:我不建议以这种方式做事——正如我所说,我建议使用 TypeScript 的结构特性以最易读的方式组织你的代码。

但是,如果您想使用类型声明,您可以定义函数的类型:

var f: { (): void; prop: string; } = (() => {
    var _f : any = function () { 
        alert(_f.prop);
    };
    _f.prop = "blah";
    return _f;
}());

f();

这允许调用者f获得自动完成和类型检查,但不会导致内容f被检查以确保它符合 - 因为你在这个阶段是“幕后” - 所以你可以写这个......

var f: { (): void; prop: string; } = (() => {
    var _f : any = undefined;
    return _f;
}());

f();

如果您想对定义进行类型检查f以及调用f检查,则需要查看类。

于 2012-10-31T23:26:36.507 回答
2

您可以通过利用声明合并结构类型来干净地管理它并使用完整的类型信息!

interface functionWithProperty {
    (): any;
    prop: string;
}


function MyCoolFunc() {
    return "yay";
}

module MyCoolFunc {
    export var prop: string = "wow";
}

// this will compile without errors, MyCoolFunc implements the
// functionWithProperty interface (structurally)
let x: functionWithProperty = MyCoolFunc;

console.log(x.prop, x());
console.log(MyCoolFunc.prop, MyCoolFunc());

// this would result in a compiler error
// let y: functionWithProperty = console.log;

编译后的javascript看起来很像您在问题中给出的示例,但 TypeScript 编译器会确切地知道发生了什么!基本上,MyCoolFunc 的模块声明被添加到函数声明中,从而产生一个具有属性的函数。

如果你想在编译时断言 MyCoolFunc 正确地实现了 functionWithProperty,你可以在你的模块中有一个未导出的变量声明,就像上面例子中的那样。

于 2015-08-29T21:20:51.170 回答