在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
。
答案 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 merging和structural 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,你可以在你的模块中有一个未导出的变量声明,如上例所示。