打字稿是否允许接口和字符串联合类型?

时间:2018-06-28 03:31:05

标签: javascript typescript

我正在尝试实现类似这样的方法,该方法采用一个关键参数,该参数可以是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'; ),但在这种情况下不起作用,因为该接口是可索引类型的接口....

3 个答案:

答案 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。

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