【问题标题】:TypeScript Omit and keyofTypeScript 省略和 keyof
【发布时间】:2020-07-17 07:13:58
【问题描述】:

我遇到过这种类型的 ModelFields,我仍在尝试理解它。

 type ModelFields<T> = Partial<Omit<T, keyof BaseModel>> & {
      created_at?: Date;
      updated_at?: Date;
     };

我理解 Partial,所有属性都是可选的。我理解 &(类型的交集)。

让我们从 keyof BaseModel 开始,其计算结果为:

"created_at" | "updated_at" | "modelName" | "primaryKey" | "columnIndexes" | "modelFields" | "indexes" | "findById

典型用法是在 findby 中返回 ModelFields。

所以在ModelFields类型的构造中。那里做了很多事情。选择 T 的属性后,为什么排除 BaseModel 的键?任何人都可以为试图理解 TypeScript 以掌握排除 BaseModel 键的原因的人分解这一点

 class BaseModel {
  created_at?: Date;
  updated_at?: Date;

  constructor() {}


  get modelName(): string {
    
  }

  
  get primaryKey(): FieldOptions | undefined {
   
  }

  get columnIndexes(): {[key: number]: Array<FieldOptions>;} {
    
  }

 
  get modelFields(): FieldOptions[] {
    
  }

  get indexes(): Index[] {
    
  }


  async findById(id: string | number): Promise<ModelFields<this> | undefined> {
    
  }

  
}

另一种典型用法:

class AddressModel extends BaseModel {
 
  id!: number;

  address!: string;

}


class UserModel extends BaseModel {
 
  id!: number;
 
  nickName?: string;
  
  password?: string;

  defaultVal?: string;

  address?: ModelFields<AddressModel>;
}

【问题讨论】:

    标签: typescript generics


    【解决方案1】:

    因为你的类型定义中有这个

    Partial<Omit<T, keyof BaseModel>>
    

    这意味着

    1. 取泛型类型T
    2. 移除 BaseModel 的属性(因为 Omit
    3. 将上述结果类型的所有属性设为可选

    【讨论】:

    • 感谢您的回答,我的困惑是,如果 T 是 BaseModel 类型,则结果类型的属性是什么。查看更新的问题。
    • 没关系,只会删除 BaseModel 的属性,因为您省略了 keyof BaseModel(而不是例如 keyof T)。所以只会删除 BaseModel 的键
    • 哇,尤里卡,现在我明白了。例如,ModelFields,它将移除 BaseModel 的键并保留 AddressModel 的键,即 id |地址并添加 createdAt 和 updatedAt?所以因为 AddressModel 继承了这些键,所以它们被删除了。聪明的东西。这是正确的吗?
    【解决方案2】:

    通过示例提供演练:

    假设,T 是一个泛型类型,并且说它是一个像下面这样的类型

        interface ExampleT {
            created_at: Date;
            modelName: string;
            modelType: string;
        }
    
    1. Omit&lt;T, keyof BaseModel&gt;。它将删除 存在于 BaseModel 中的属性或键。因此,在这种情况下,它将删除created_atmodelName,结果将类似于下面的T1
        interface T1 {
            modelType: string;
        }
    
    1. Partial&lt;Omit&lt;T, keyof BaseModel&gt;&gt;Partial&lt;T1&gt;Partial 使类型中存在的所有键都是可选。所以它会变成下面的T2
        interface T2 {
            modelType?: string;
        }
    
    1. 接下来,我们有&amp;(交集类型)。它将结合这两种类型。所以

      Partial&lt;Omit&lt;T, keyof BaseModel&gt;&gt; &amp; { created_at?: Date; updated_at?: Date; }

      T2 &amp; { created_at?: Date; updated_at?: Date; }

      ModelFields&lt;ExampleT&gt;

      会变成:

       interface T3 {
           modelType?: string;
           created_at?: Date; 
           updated_at?: Date;
       }
      

    希望这有帮助。

    【讨论】:

      猜你喜欢
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多