1

我有一个简单的类,它允许设置和获取类对象的通用值(想象这个类是由 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 将值返回为 typeany而不是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;

这种情况有破解方法吗?

4

1 回答 1

1

我能想到的一种方法是,如果Spec有一个通用参数来表示调用的类型data和时间setthis则返回但它的类型已修改以反映新添加的字段。这种方法的问题在于,您需要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
于 2018-06-16T13:42:50.173 回答