代码之家  ›  专栏  ›  技术社区  ›  user776686

接受setter中的数组和非数组值-解决不同的访问器类型

  •  1
  • user776686  · 技术社区  · 6 年前

    我的角度组件有一个输入,通常对字符串数组进行操作:

    @Input() names: string[]
    
    <my-comp [names]="['Adam', 'Betty']"></my-comp>
    

    但是我想提供一个替代的语法,这样用户就可以提供一个单独的值而不必键入括号:

    <my-comp names="Adam"></my-comp>
    

    然后在setter中处理它,就像这样:

    private _names: string[];
    @Input() set names(value: string[] | string) {
      this._names = Array.isArray(value) ? value : [value];
    }
    get names(): string[] {
      return this._names;
    }
    

    但是,这会导致tslint错误ts2380,抱怨访问器应该具有相同的类型。

    我的问题是:有没有好的方法来解决这样的案件?

    0 回复  |  直到 6 年前
        1
  •  1
  •   smnbbrv    6 年前

    好吧,typescript将属性访问器看作是不动产,并且对其要求非常严格。

    最简单的方法就是给getter/setter起不同的名字,例如。

    private _names: string[];
    
    @Input() set names(value: string[] | string) {
      this._names = Array.isArray(value) ? value : [value];
    }
    
    get namesArray(): string[] {
      return this._names;
    }
    

    或者,在这种特殊情况下,angular允许将其映射到真实的输入名

    names: string[];
    
    @Input('names') set namesMixed(value: string[] | string) {
      this.names = Array.isArray(value) ? value : [value];
    }
    

    所以你甚至不需要私人财产。

    推荐文章