【问题标题】:multiple `extends keyof` in overload重载中的多个“扩展keyof”
【发布时间】:2020-10-01 06:07:51
【问题描述】:

问题: 是否有可能在 1 个重载中有多个 extends key of 之类的东西?

我想做的事:

this.form.get("data.subdata").value

这将返回一个类型化的数据。目前它返回unknown

到目前为止我做了什么

我正在以这种方式创建类型化表单控件

this.form.get("data").get("subdata").value

这行得通,但如果可能的话,我不想使用多次获取。

我的班级如下:

export class TypedFormControl<T = any> extends FormControl {
  readonly valueChanges: Observable<T>;
  readonly value: T;
  setValue(value: T, options?: Object) {
    FormControl.prototype.setValue.call(this, value, options);
  }
  get<K extends keyof T>(path: K): TypedAbstractControl<T[K]>;
  get<S>(path: (string | number)[] | string): TypedAbstractControl<S>;
  get(path: (string | number)[] | string): TypedAbstractControl<any> {
    return FormControl.prototype.get.call(this, path);
  }
}

我本来想做这样的事情,但它肯定不喜欢它。

get<J extends keyof K extends keyof T>(path: K.J): TypedAbstractControl<T[K]>;

更新:我认为这次尝试更接近,但它仍然抱怨 J 不能成为 K 的索引 :(

  get<J extends keyof K, K extends keyof T>(path: [K, J]): TypedAbstractControl<T[K][J]>;

我会很感激任何帮助,我在网上寻找了一段时间无济于事。

干杯

【问题讨论】:

    标签: typescript types overloading


    【解决方案1】:

    我搞定了!

    get<J extends keyof T[K], K extends keyof T>(path: [K, J]): TypedAbstractControl<T[K][J]>;
    

    这让我可以像这样使用它

    this.form.get(['data', 'subdata']).value;
    

    返回的值是正确的类型 :)

    【讨论】:

      猜你喜欢
      • 2021-07-02
      • 2015-01-24
      • 1970-01-01
      • 2021-09-29
      • 2011-08-11
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多