将属性装饰器限制为TypeScript

时间:2019-03-12 21:01:31

标签: typescript

注意:此问题扩展了Property decorator only for a specific property type

-

我的目标是设计一个简单的ORM,其中可以这样定义一个模型:

@model.model()
class User extends model.Model {

  @model.attr(model.StringType)
  user: string;

  @model.attr(model.StringType)
  age: number;

}

在此模型中,我希望编译器抛出类型错误,因为StringType无法应用于类型number的属性。但是,我无法使其正常工作-不会引发任何错误。

到目前为止,我的代码:

interface Constructor<T> {
  new (...args: any[]): T;
}

abstract class BaseType<T> {}

class StringType extends BaseType<string> {}

type RecordKey = string | symbol;

export function attr<T>(type: Constructor<BaseType<T>>) {
  return <K extends RecordKey, C extends Record<K, T>>(ctor: C, key: K) => {
    console.log(ctor, key);
  }
}

一些有关此代码如何工作的指针在这里将非常有用。

0 个答案:

没有答案