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

时间:2012-10-31 22:59:20

标签: typescript

在JavaScript中,我可以这样做:

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

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

除了类之外,我可以使用哪种TypeScript模式来强制函数获取属性?

我可以使用界面吗?

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

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

我看到this example

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

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

2 个答案:

答案 0 :(得分: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,则需要查看类。

答案 1 :(得分:2)

利用declaration mergingstructural typing,您可以干净利落地管理完整类型信息!

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;

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

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