TypeScript:在函数上声明一个具有必需属性的函数

时间:2017-04-24 13:40:05

标签: typescript

我想要一个标记函数,其界面如下:

interface TaggedFun {
    (args): void;
    tag: boolean;
}

似乎实际上不可能声明一个与此签名匹配的函数(因为任何函数文字都会缺少必需的tag属性);

唯一的选择是让tag成为可选项,并记住之后为其分配值。

有没有办法保持这种类型安全(即类型中的标签要求)?

2 个答案:

答案 0 :(得分:1)

您可以在工厂函数中创建TaggedFun的实例:

interface TaggedFun {
    (): void;
    tag: boolean;
}

function taggedFactory(tag: boolean, fn?: () => void): TaggedFun {
    let tagged = (fn || function () {
        // function body here
    }) as TaggedFun;

    tagged.tag = tag;
    return tagged;
}

通过这种方式,您始终知道您拥有tag属性(如果您使用工厂创建实例),并且您可以获得类型安全性。
例如:

function doSomething(tagged: TaggedFun) {}

doSomething(() => { }); // error 
doSomething(taggedFactory(true)); // ok
doSomething(taggedFactory(true, () => { })); // ok

code in playground

答案 1 :(得分:0)

不是一个干净的方式,这样做的方式就像你说的那样。

这是为了支持旧式javascript,而不是类,你可以使用具有额外属性的函数。

我建议您考虑使用课程。