【问题标题】: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 就像“伙计,我没有......”
  • 也许这会有所帮助:stackoverflow.com/a/40718205/1497533

标签: javascript typescript


【解决方案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。

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

      【讨论】:

      • 检查实例是否为字符串会更容易一些,如果不是,则假设它是接口的实例......所以我作弊了一点,但它很轻量级并且有效.. .我认为当联合类型由多个接口组成时,你的方式会很健壮......
      猜你喜欢
      • 2018-04-28
      • 2017-09-16
      • 2020-11-04
      • 2021-08-01
      • 2019-05-26
      • 2022-10-25
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多