Type inference worked in 4.2.3 but fails in 4.3.2

未关闭
#44,412 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
typescript
领域
compilers

调研方向

从链接的 TypeScript Playground 复现开始,比较 4.2.3 和 4.3.2 版本之间的推断,重点关注 choices 数组中的 null 选择以及 promptChoice 调用。完成的标准是该示例不再报告元组赋值错误,并且 choice 被推断为 'one'|'two'|'three'

由索引模型根据 Issue 内容生成。

描述

Bug Domain: check: Type Inference

Bug Report

🔎 Search Terms

type inference

🕗 Version & Regression Information

4.3.2

  • This is a crash
    [x] This changed between versions 4.2.3 and 4.3.2
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about _________
  • I was unable to test this on prior versions because _______
⏯ Playground Link

Playground link with relevant code

💻 Code

(strict null checks off)

interface PromptChoiceOptions<T extends string> {
	label: string;
	button: string;
	default?: T;
	choices: readonly ( T | [ string, T ] )[];
}

function promptChoice<T extends string>( options?: Partial<PromptChoiceOptions<T>> ) {
    return options?.choices?.[ 0 ] ?? null; // simplified
}

const choice = promptChoice( { label: 'example', button: 'select', choices: [
    [ 'null', null ], // problem seems to be related to this line
    [ 'One', 'one' ],
    [ 'Two', 'two' ],
    [ 'Three', 'three' ]
] } );
🙁 Actual behavior

Type [string, "two"] is not assignable to type [string, "one"]

🙂 Expected behavior

choice is inferred to be 'one'|'two'|'three'


In creating a minimal repro for this, I discovered that commenting out the null choice makes the code behave properly. Also, changing the type of choices to readonly ( T | [ string, T|null] )[]; with strict null checking makes the problem always occur.

主要语言
Go
星标
111k
派生
14.4k
平均合并
1 天 19 小时
30 天内合并 PR
117

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

microsoft/TypeScript 的其他 Issue

查看 microsoft/TypeScript 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。