我正在開發一個服務定位器項目,並期待函數能夠被傳遞,需要一個參數。檢查函數簽名
這裏有一個片段:
"use strict";
/** Declaration types */
type ServiceDeclaration = Function|Object;
export default class Pimple {
/**
* @type {{}}
* @private
*/
_definitions: {[key: string]: ServiceDeclaration} = {};
/**
* Get a service instance
* @param {string} name
* @return {*}
*/
get(name: string): any {
if (this._definitions[name] instanceof Function) {
return this._definitions[name](this);
}
return this._definitions[name];
}
}
然而,當我嘗試編譯此我得到以下錯誤:
error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'ServiceDeclaration' has no compatible call signatures.
我試圖創建一個新的類型:
type ServiceFunction = (container: Pimple) => any;
並試圖更改instanceof Function
至instanceof ServiceFunction
,但後來我得到以下錯誤:
error TS2693: 'ServiceFunction' only refers to a type, but is being used as a value here.
我環顧四周,但一直未能找到任何檢查傳遞的函數是否匹配指定簽名的示例。
謝謝。我測試了幾個變體,發現關鍵部分是先賦值'let f = this._definitions [name];'然後檢查並使用局部變量。我不需要外部函數,我可以做'if(f instanceof Function){return f; }' –
@AndrewShell你說得對。我編輯過。 – Paleo