Typescript 使用标记generic在接口外创建联合

Typescript 使用标记generic在接口外创建联合,typescript,Typescript,我目前有一个TypeForm类,我希望有特定的功能 在这里,我可以使用此或泛型“标记”属性。下面是我的例子 使用一个接口,但想法应该是一样的 我想这样做: export type Or<T, B> = T & { or?: undefined }; interface Example { name: Or<string, 'firstName' | 'lastName'> firstName: Or<string, 'name'> la

我目前有一个TypeForm类,我希望有特定的功能 在这里,我可以使用此
泛型“标记”属性。下面是我的例子
使用一个接口,但想法应该是一样的

我想这样做:

export type Or<T, B> = T & { or?: undefined };

interface Example { 
  name: Or<string, 'firstName' | 'lastName'>
  firstName: Or<string, 'name'>
  lastName: Or<string, 'name'>
}
type UnionKeys<T> = T extends T? keyof T : never;
type StrictUnionHelper<T, TAll> = T extends T? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, undefined>> : never;
export type StrictUnion<T> = StrictUnionHelper<T, T>

type E = StrictUnion<
  { firstName: string, lastName: string } |
  { name: string }
>
这样的事情可能吗

更新:

这是一个正确的方向:

type Build<T> = StrictUnion<{ [P in keyof T]: T[P] extends { or: any } ? Pick<T, T[P]['or']> : never }[keyof T]>

const v:Build<Example> = { 
  name: 'hi'
}
type Build=StrictUnion
常量v:Build={
姓名:“你好”
}
导出类型Or=T&{Or?:B};
接口示例{
姓名:或
名字:或
姓氏:或
}
类型Build=StrictUnion
类型工作=构建
常数a:工作={
名字:“喵”,
姓:“汪”
}
常数b:工作={
名字:“喵”
}

什么是严格联盟?我找到了,但它没有在带有StrictUnion的TypeScriptAdded中实现,。
export type Or<T, B> = T & { or?: B };

interface Example { 
  name: Or<string, 'firstName' | 'lastName'>
  firstName: Or<string, 'name'>
  lastName: Or<string, 'name'>
}

type Build<T> = StrictUnion<{ [P in keyof T]: T[P] extends { or?: any } ? Pick<T, T[P]['or']> : never }[keyof T]>

type Working = Build<Example>

const a: Working = { 
  firstName: 'meow',
  lastName: 'woof'
}

const b: Working = { 
  name: 'meow'
}