TypeScript无法缩小类型

问题描述 投票:0回答:1

((如果您找到更好的名字,请告诉我)

我有一个接收两个参数的函数,即工作和雇员。员工是可选的:如果计划了工作,则员工将在那儿,否则不需要。

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.有什么方法可以实现我在这里想要做的事情?

javascript typescript typescript-generics tsc conditional-types
1个回答
0
投票

我想类型防护还没有那么先进。

虽然您可以重载f:

 function f(job: ScheduledJob, employee: WorkingEmployee);
 function f(job: Job, employee?: WorkingEmployee) {
   //...
 }
© www.soinside.com 2019 - 2024. All rights reserved.