typescript - 使用标签泛型创建接口外的联合
问题描述
我目前有一个 typeorm 类,我希望有特定的功能,我可以用这个Or
泛型“标记”属性。下面在我的示例中,我使用的是接口,但想法应该是相同的。
我想做这样的事情:
export type Or<T, B> = T & { or?: undefined };
interface Example {
name: Or<string, 'firstName' | 'lastName'>
firstName: Or<string, 'name'>
lastName: Or<string, 'name'>
}
我想传递Example
给另一个泛型Build<Example>
,让它变成这样:
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'
}
解决方案
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'
}
推荐阅读
- javascript - 尝试创建可读的输出包但错误消息:-找不到入口模块:错误:无法解析'./src/index.js'
- aframe - 除非打开检查器,否则音频无法在 Aframe 中播放
- javascript - 当我想更改值时,我无法在我的 svg 中选择(“文本”)
- java - Java循环垂直
- flutter - Flutter:Inkwell 小部件和“支持点击的小部件”的作用
- angular - 我应该为单独的页面创建一个状态吗?
- thread-safety - 英特尔 MKL Pardiso 库可以与 MPI 一起运行吗?
- firebase - 将 Firebase 网络应用链接到 Firebase 托管网站有什么好处?
- javascript - 如何连接到 TCP 服务器并将 Javascript 传递给它
- javascript - 展示