我有一个接收两个参数的函数,即工作和雇员。员工是可选的:如果计划了工作,则员工将在那儿,否则不需要。
type Job = {
name: string;
schedule?: string;
}
type WorkingEmployee = {
doWork: (jobName: string) => void
}
function f(job: Job, employee?: WorkingEmployee){
if (job.schedule) {
if (employee) {
employe.do(job.name)
}
}
}
但是,我不仅仅知道这一点。我知道,如果安排好工作,那么员工就会在那里。因此,我想强制执行并利用这些知识:
type ScheduledJob = {
task: string;
isDoable: string;
}
type Employee<T> = T extends ScheduledJob ? WorkingEmployee : undefined;
function f<T extends Job>(job: T, employee: Employee<T>){
if (job.schedule) {
employee.doWork(job.name);
}
}
但是打字稿不接受:"Object is possibly undefined"
,指的是employee.doWork
。为什么不接受呢?如果存在schedule
,那么我们可以肯定地知道employee
不是undefined
。
我的问题是:1.为什么编译器不接受此代码?2.有什么方法可以实现我在这里想要做的事情?
我想类型防护还没有那么先进。
虽然您可以重载f:
function f(job: ScheduledJob, employee: WorkingEmployee);
function f(job: Job, employee?: WorkingEmployee) {
//...
}