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

Posted

技术标签:

【中文标题】打字稿是不是允许接口和字符串联合类型?【英文标题】:Does typescript allow interface and string union types?打字稿是否允许接口和字符串联合类型? 【发布时间】:2018-12-07 00:41:22 【问题描述】:

我正在尝试实现一个类似的方法,该方法采用一个关键参数,即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);
    
    

Typescript 为 if 块提供以下错误:

[ts] 'IValidationContextIndex' 仅指一种类型,但在这里用作值。

关于如何解决这个问题的任何想法?

对于大多数界面,我认为可以添加type 属性(type: 'IValidationContextsIndex'; ),但在这种情况下不起作用,因为接口是可索引类型的接口 ....

【问题讨论】:

你可以使用任何类型 如果我执行 key: any 并执行 instanceof 检查,我仍然会收到相同的错误... 请记住,一旦您转译为 javascript,接口和类型就会消失。这些用于您的代码检查和 linting。不是为了你的最终结果。 是的,我理解那部分 - 基本上界面已经消失了,所以 Typescript 就像“伙计,我没有......” 也许这会有所帮助:***.com/a/40718205/1497533 【参考方案1】:

没有一种方法可以在运行时检查 typescript 中的类型,因为几乎所有东西都在转译后变成了一个对象,所以你可能需要按照user-defined typed guards 的定义来做一些事情

【讨论】:

【参考方案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);
      
      

【讨论】:

【参考方案3】:

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

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

【讨论】:

检查实例是否为字符串会更容易一些,如果不是,则假设它是接口的实例......所以我作弊了一点,但它很轻量级并且有效.. .我认为当联合类型由多个接口组成时,你的方式会很健壮......

以上是关于打字稿是不是允许接口和字符串联合类型?的主要内容,如果未能解决你的问题,请参考以下文章

无法让嵌套类型保护与打字稿中的联合类型一起使用

打字稿:允许泛型类型仅是具有“字符串”属性的对象

将打字稿接口属性类型转换为联合[重复]

类型为 String 时如何在 DB 中查找项目 |使用打字稿联合类型的字符串 []

打字稿:检查类型是不是为联合

打字稿:将标记的联合转换为联合类型