gpt4 book ai didi

javascript - TypeScript 无法缩小类型

转载 作者:行者123 更新时间:2023-12-02 21:09:56 26 4
gpt4 key购买 nike

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

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

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);
}
}

但是 typescript 不接受它:“对象可能未定义”,指的是employee.doWork。为什么它不接受呢?如果 schedule 存在,那么我们就可以确定 employee 不是 undefined

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

最佳答案

当函数被调用时,泛型类型会被缩小。在定义时,您只知道T 是某种Job。类型保护会缩小 job 的类型,它不会改变 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) {
//...
}

关于javascript - TypeScript 无法缩小类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61125706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com