对象上的泛型类型

时间:2018-06-16 13:25:59

标签: typescript object generics types

我有一个简单的类,允许设置和获取类对象的通用值(想象一下这个类是由NPM包提供的。)

class Spec {
    protected data = {};
    set<T>(k: string, v: T) {
        this.data[k] = v;
    }
    get(k: string) {
        return this.data[k];
    }
}

我们说我创建了这个类的实例并设置了id类型的number字段:

const spec = new Spec();
spec.set('id', 100);

当我检索此值时,TypeScript将值返回为any类型而不是number

const id = spec.get('id');
// id should be of typescript type number (any instead)

我可以手动指定类型,但我想自动处理:

const id = spec.get<number>('id');
// or
const id = spec.get('id') as number;

这种情况有没有?

1 个答案:

答案 0 :(得分:1)

我能想到的一种方法是,如果Spec有一个通用参数来表示data的类型,并且在调用set时,会返回this但是它的类型被修改以反映新添加的字段。这种方法的问题在于,您需要在将值分配给变量之前对set进行所有调用,或者在新变量中保存set的每个后续结果,因为它将具有不同的变量类型。

class Spec<TAll = {}>{
  protected data: TAll = {} as any;
  set<TKey extends string, TValue>(k: TKey, v: TValue): Spec<TAll & { [P in TKey]: TValue }> {
    (this.data as any)[k] = v;
    return this as any
  }
  get<TKey extends keyof TAll>(k: TKey) {
    return this.data[k];
  }
}


const spec = new Spec().set('id', 100);

spec.get('id') // is number