我正在尝试实现类似这样的方法,该方法采用一个关键参数,该参数可以是string
或可索引类型接口IValidationContextIndex
的实例。实现看起来像这样:
/**
* Gets all ValidationContext container values.
* @returns An array of ValidationContext instances contained in the cache.
*/
public static getValidationContextValues(key: IValidationContextIndex | string ): Array<ValidationContext> {
if (key instanceof IValidationContextIndex ) [
return Object.values(<any> key);
]
else {
const vci = ValidationContainer.cache[<string>key];
return Object.values(<any> vci);
}
}
打字稿为if
块给出以下错误:
[ts]'IValidationContextIndex'仅引用一种类型,但在此处用作值。
关于如何解决此问题的任何想法?
对于大多数界面,我认为可以添加一个type
属性(type: 'IValidationContextsIndex'
;
),但在这种情况下不起作用,因为该接口是可索引类型的接口....
答案 0 :(得分:2)
没有一种方法可以在运行时检查打字稿中的类型,因为几乎所有的东西一旦被编译就成为对象,因此您可能必须遵循定义为user-defined typed guards的内容
答案 1 :(得分:2)
我认为这可以做到(根据@indrakumara的提示):
/**
* Gets all ValidationContext container values fpr a
* Object_property string valued key or a key that is an instance of
* IValidationContextIndex).
* @returns An array of ValidationContext instances contained in the cache that corresponds to a specific Object_property key.
*/
public static getValidationContextValues(key: any ): Array<ValidationContext> {
if (typeof key === `string` ) {
const vci = ValidationContainer.cache[<string>key];
return Object.values(<any> vci);
}
else {
return Object.values(<IValidationContextIndex> key);
}
}
答案 2 :(得分:1)
打字稿中的接口不会转换为javascript中的任何代码。因此,在您的代码“ instanceof IValidationContextIndex”中,JavaScript中不存在IValidationContextIndex。
将您的接口更改为类,或者让一个类实现该接口,然后检查传递的参数是否是该类的实例。