我想要一个标记函数,其界面如下:
interface TaggedFun {
(args): void;
tag: boolean;
}
似乎实际上不可能声明一个与此签名匹配的函数(因为任何函数文字都会缺少必需的tag
属性);
唯一的选择是让tag
成为可选项,并记住之后为其分配值。
有没有办法保持这种类型安全(即类型中的标签要求)?
答案 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
答案 1 :(得分:0)
不是一个干净的方式,这样做的方式就像你说的那样。
这是为了支持旧式javascript,而不是类,你可以使用具有额外属性的函数。
我建议您考虑使用课程。