我有一个简单的类,允许设置和获取类对象的通用值(想象一下这个类是由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;
这种情况有没有?
答案 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