如何获取通用对象的已知属性的类型。
例如:
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>)
}
}
答案 0 :(得分:1)
我们需要在portion
方法级别添加泛型。考虑以下:
portion<K extends keyof T>(key: K){
return {
...
setValue: (value: T[K]) => this.patch({
[key]: value
} as Record<K, T[K]>)
}
}
中的简化版本
最终版本由注释中链接的代码组成:
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>)
}
}
}