typescript 扩展必须包括union之一

blmhpbnm  于 2023-03-13  发布在  TypeScript
关注(0)|答案(2)|浏览(118)

给定:

export type MapToInput<T> = {
  [K in keyof T]: T[K] extends firestore.Timestamp | undefined | null
    ? firestore.Timestamp | Date
    : T[K];
};

何时:

interface Boop {
  a: undefined;
}

type x = MapToInput<Boop>;

我想:
x.a不是firestore.Timestamp | Date。有没有办法在上面的类型中说
我想匹配:

  • firestore.Timestamp
  • firestore.Timestamp | undefined
  • firestore.Timestamp | null
  • firestore.Timestamp | undefined | null

但不是:

  • undefined
  • undefened | null
  • null

罚款:

interface Beep {
  a: firestore.Timestamp;
}

type y = MapToInput<Beep>;

罚款:

interface Blab {
  a?: firestore.Timestamp;
}

type z = MapToInput<Blab>;
t30tvxxf

t30tvxxf1#

如果我正确地理解了类型的意图,那么如果firestore.Timestamp已经存在于属性类型中,则添加Date
我认为最简洁的解决方案是使用一个分配条件类型来添加联合体的额外组成元素,使用分配条件类型,我们可以考虑联合体的每个组成元素,如果它是Timestamp,则添加Date,如果不是,则保持不变,这样,我们就可以完全避免nullundefined组合的问题:

export type AddTimeStamp<T> = T extends firestore.Timestamp?
           firestore.Timestamp | Date:
           T;
export type MapToInput<T> = {
    [K in keyof T]: AddTimeStamp<T[K]>;
};

Playground链接

utugiqy6

utugiqy62#

排除你不想要的类型并选择never。这将导致你想要的行为

interface Timestamp {
    [val]: typeof val
}

export type MapToInput<T> = {
    [K in keyof T 
      as [Exclude<T[K], undefined | null>] extends [never] ? never : K]:  
     T[K]
};

interface Boop {
    a: undefined;
    b: Timestamp,
    c: Timestamp | undefined,
    d: Timestamp | null,
    e: Timestamp | undefined | null
    f: undefined | null
    g: null
}

type x = MapToInput<Boop>;

相关问题