Typescript 使用标记generic在接口外创建联合
我目前有一个TypeForm类,我希望有特定的功能 在这里,我可以使用此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
或泛型“标记”属性。下面是我的例子
使用一个接口,但想法应该是一样的
我想这样做:
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'
}