Javascript TypeScript无法缩小类型 (如果你找到更好的名字,请告诉我)

Javascript TypeScript无法缩小类型 (如果你找到更好的名字,请告诉我),javascript,typescript,typescript-generics,tsc,conditional-types,Javascript,Typescript,Typescript Generics,Tsc,Conditional Types,我有一个函数,它接收两个参数,一个job和一个employee。员工是可选的:如果工作已安排,员工将在那里,否则不需要 type Job = { name: string; schedule?: string; } type WorkingEmployee = { doWork: (jobName: string) => void } function f(job: Job, employee?: WorkingEmployee){ if (job.sc

我有一个函数,它接收两个参数,一个job和一个employee。员工是可选的:如果工作已安排,员工将在那里,否则不需要

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);
    }
}
类型ScheduledJob={
任务:字符串;
isDoable:字符串;
}
类型Employee=T扩展ScheduledJob?工作人员:未定义;
职能f(职务:T,员工:员工){
if(作业进度表){
employee.doWork(job.name);
}
}
但typescript不接受它:
“对象可能未定义”
,指的是
employee.doWork
。为何不接受呢?如果有
计划
,那么我们可以确定
员工
不是
未定义的

我的问题是: 1.为什么编译器不接受此代码?
2.有什么方法可以实现我在这里要做的吗?

调用函数时,泛型类型的范围会缩小。在定义时,您只知道
T
是某种
工作
。typeguard将缩小
作业的类型,它不会更改
t
所指的内容

 let a: T, b: T;

 if(a.narrow) {
   // a can be narrowed down, but it is unknown wether the same applies to b. Thus T cannot be narrowed.
 }
但您可以重载f(不确定它是否按预期工作,但它比具有条件类型的泛型函数更清晰):

 function f(job: ScheduledJob, employee: WorkingEmployee);
 function f(job: Job, employee?: WorkingEmployee) {
   //...
 }