想象一下,我有一个名为Person
的类型,适用于有工作或没有工作的人。如果有工作的人,需要提供通过传递Job
泛型而变化的工作详细信息。
理想情况下,我认为这应该起作用:type Person<Job = undefined> = { name: string, job: Job extends undefined? never : Job }
,但不是。
我必须像这样编码:type People<Job = undefined> = Job extends undefined ? { name: string } : { name: string, job: Job }
才能工作,这很冗长。
有人能给出更好的解决方案吗?谢谢请查看此游乐场或阅读以下内容:
type Teacher = { school: string }
type Engineer = { company: string }
type Job = Teacher | Engineer
// type People<Job = undefined> = Job extends undefined ? { name: string } : { name: string, job: Job } // passed, but a lot verbose
type Person<Job = undefined> = { name: string, job: Job extends undefined? never : Job } // error: personWithoutJob missing job
const personWithoutJob: Person = { name: 'Ron' }
const personWithJob: Person<Teacher> = { name: 'Angela', job: { school: 'a' } }
一个好的方法是交集类型。
像这样:
type Person<Job = undefined> = { name: string } & (Job extends undefined ? {} : { job: Job });
更新的操场
官方交叉口类型文件