获取通用对象中已知属性的类型

时间:2020-02-03 09:30:13

标签: typescript types

如何获取通用对象的已知属性的类型。

例如:

export class someclass extends BehaviorSubject<T> {

  constructor(initialValue: T) {
      super(initialValue)
  }

  patch(value: Partial<T>) {
      this.next({ ...this.getValue(), ...value });
  }

  ...

  portion(key: keyof T){
    return {

      ...

      setValue :(value: ***THE TYPE OF THIS VALUE***) => this.patch({
        [key]: value as any
      } as Partial<T>)
    }
  }
}

在此示例中,我有一个扩展BehaviorSubject的类。

我创建了一个part函数,该函数获取了BehaviorSubject类型T中存在的某些键, 该部分是获取键并返回带有几个函数的对象的函数,其中之一是setValue。

此函数将获得一个值,该值可通过part函数中获得的键修补到BehaviorSubject中。

我正在尝试为value添加类型,因此它不会像T [key]那样是正确的类型


我知道可以添加自己(例如下面的示例),但是我不想

  portion<K>(key: keyof T){
    return {

      ...

      setValue :(value: K) => this.patch({
        [key]: value as any
      } as Partial<T>)
    }
  }

1 个答案:

答案 0 :(得分:1)

我们需要在portion方法级别添加泛型。考虑以下:

portion<K extends keyof T>(key: K){
    return {

      ...

      setValue: (value: T[K]) => this.patch({
        [key]: value
      } as Record<K, T[K]>)
    }
  }

playground

中的简化版本

最终版本由注释中链接的代码组成:

export class SLocal<T> extends BehaviorSubject<T> {

    constructor(initialValue: T) {
        super(initialValue)
    }

    patch(value: Partial<T>) {
        this.next({ ...this.getValue(), ...value });
    }

    setState(value: T) {
        this.next(value);
    }

    portion<K extends keyof T>(key: K){
      return {
        asObservable: () => this.pipe(pluck(key)),
        getValue :() => this.getValue()[key],
        setValue :(value: T[K]) => this.patch({
          [key]: value
        } as Record<K, T[K]> as Partial<T>)
      }
    }
}