Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript typescript是否允许接口和字符串联合类型?_Javascript_Typescript - Fatal编程技术网

Javascript typescript是否允许接口和字符串联合类型?

Javascript typescript是否允许接口和字符串联合类型?,javascript,typescript,Javascript,Typescript,我正在尝试实现这样一个方法,它采用一个键参数,该参数要么是字符串,要么是可索引类型接口的实例IValidationContextIndex。实现如下所示: /** * Gets all ValidationContext container values. * @returns An array of ValidationContext instances contained in the cache. */ public static getValidationCon

我正在尝试实现这样一个方法,它采用一个键参数,该参数要么是
字符串
,要么是可索引类型接口的实例
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);
    }
  }  
/**
*获取所有ValidationContext容器值。
*@返回缓存中包含的ValidationContext实例数组。
*/
公共静态getValidationContextValues(键:IValidationContextIndex |字符串):数组{
if(IValidationContextIndex的键实例)[
返回Object.values(键);
]
否则{
const vci=ValidationContainer.cache[key];
返回对象值(vci);
}
}  
Typescript为
if
块提供以下错误:

[ts]“IValidationContextIndex”仅引用类型,但在此处用作值

有没有办法解决这个问题

对于大多数界面,我认为可以添加一个
type
属性(
type:'IValidationContextsIndex'

),但这在这种情况下不起作用,因为该接口是一个可索引类型的接口….

由于几乎所有内容都在传输后成为对象,因此在运行时无法检查typescript中的类型,因此您可能必须遵循定义为

的内容,我认为这可以做到(根据@indrakumara的提示):

/**
*获取所有ValidationContext容器值fpr a
*对象\属性字符串值键或作为
*IValidationContextIndex)。
*@返回缓存中包含的ValidationContext实例数组,该数组对应于特定的Object_属性键。
*/
公共静态getValidationContextValues(键:any):数组{
if(键的类型==`string`){
const vci=ValidationContainer.cache[key];
返回对象值(vci);
}
否则{
返回Object.values(键);
}
}  

typescript中的接口不会转换为javascript中的任何代码。因此,在代码“instanceof IValidationContextIndex”中,javascript中不存在IValidationContextIndex


将接口更改为类或让一个类实现该接口,然后检查传递的参数是否为该类的实例。

如果我执行
键:any
并执行实例检查,则可以使用任意as类型。我仍然会收到相同的错误…请记住,一旦转换为javascript,接口和类型就会消失。这些是用于代码检查和筛选的。不是为了你的最终结果。是的,我理解这一部分-基本上接口已经不存在了,所以Typescript就像“Dude I Get nottin…”也许这会有所帮助:检查实例是否是字符串稍微容易一些,如果不是,则假设它是接口的实例。。。所以我有点作弊,但它是轻量级的并且有效…我认为当联合类型由多个接口组成时,您的方式将是健壮的。。。
    /**
     * 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);
      }
    }