【问题标题】:Pass dicitionary-style object parameter implementing T properties to class<T>将实现 T 属性的字典式对象参数传递给 class<T>
【发布时间】:2021-12-30 22:53:06
【问题描述】:

我正在使用继承来初始化class&lt;T&gt; 的属性,其中Object 实现所有T 属性{..} 传递给constructor

export default abstract class DatabaseObjectModel<T> extends JSONModel<T> {
  constructor(json: T) {
    super();
    this.fromJSON(json);
  }
}

export default abstract class JSONModel<T> extends ModelValidation {
  // abstract toJSON(): Object;
  // abstract fromJSON(json: Object): T;

  toJSON() {
    // Default toJSON
    return JSON.parse(JSON.stringify(this));
  }

  fromJSON(json: Object) {
    // For each key of json, assign value to this.key
    for (let key in json) {
      this[key] = json[key];
    }
  }
}

问题是,当我像这样初始化DatabaseObjectModel-inherited 类时:

new ImplementingDatabaseObjectModel({
    id: randomUUID(),
    name: "MASTER",
    permissions: [],
    assignedRoles: undefined,
})

我收到以下错误

Argument of type '{...}' is not assignable to parameter of type 'ImplementingDatabaseObjectModel

如何修改 DatabaseObjectModel&lt;T&gt; constructor 以接受 Object 实现 type T 的所有属性但不是它的实例

【问题讨论】:

    标签: typescript oop


    【解决方案1】:

    在这里找到了解决方案:

    How to create a type excluding instance methods from a class in typescript?

    export type DTO<T> = {
        [P in {
            [K in keyof T]: undefined extends T[K] ? never : T[K] extends (...args) => any ? never : K;
        }[keyof T]]: T[P] extends object ? DTO<T[P]> : T[P];
    } &
        Partial<
            {
                [P in {
                    [K in keyof T]: undefined extends T[K] ? K : never;
                }[keyof T]]: T[P] extends object ? DTO<T[P]> : T[P];
            }
        >;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多