使用带有对象属性的“if”语句时类型推断的奇怪行为

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

你能看一下这段代码吗?为什么 Typescript 抱怨第一个“if”语句中的代码,而不抱怨第二个“if”语句中的代码?

export type IssueProps = {
    type: 'job_warning' | 'job_error' | 'task_warning'
    jobId?: string
}

export type JobIssueProps = IssueProps & {
    type: 'job_warning' | 'job_error'
    jobId: string
}

const sendDeadlineJobErrorAlert = (
        deadlineIssue: JobIssueProps,
    ) => {
        console.log(deadlineIssue)
    }

const issue = {} as IssueProps

if (issue.type === 'job_error' && issue.jobId) {
    // typescript reports an error
    sendDeadlineJobErrorAlert(issue)
}

if (issue.type === 'job_error' && issue.jobId) {
    // typescript doesn't report an error
    sendDeadlineJobErrorAlert({...issue, type: issue.type, jobId: issue.jobId})
}

游乐场链接

typescript
1个回答
0
投票

在第一个 if 中,您将 IssueProps 类型传递给需要 JobIssueProps 类型的函数,因此这不起作用。

在第二个中,您传递了 IssueProps + JobIssueProps 的其他必需参数,并且您已经检查了 type 和 jobId 不为空,因此没有错误。

© www.soinside.com 2019 - 2024. All rights reserved.