Generic indexed access on a substitution type with an array constraint resolves incorrectly

未关闭
#55,383 0 条评论 3 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

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

调研方向

从链接的 TypeScript Playground 复现开始,将失败的泛型索引访问分支与添加了数组类型别名的可用变体进行比较。阅读 PR 48837 中讨论的行为,然后验证原始示例不再报告约束错误,同时保留预期的推断映射类型行为。

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

描述

Domain: Indexed Access Types Possible Improvement
🔎 Search Terms

indexed access substitution type array constraint

🕗 Version & Regression Information
  • This is the behavior in every version I tried
⏯ Playground Link

https://www.typescriptlang.org/play?#code/C4TwDgpgBAMglsCAnAhgGwCrmgXigZ2CTgDsBzKAHyhIFcBbAI2SqkYHt20IUSBuAFChIUAGrpaEAOIRgiJAB5xaSVhEQAHohIATfLATJ0a3AfnHsAPih4AFAEob15auyCh2KAGUAxgAsIehQbb39AlABBJFQQVl8AoIB5RgArCB9gVnhzTDcPEXjwqJiQ4pQQBUKk1PTM6irI6PKsw1RcyEtBYWgG5LSMkIBvASgoAG0AawgQAC4CIlIyAF053pqB+rCgstjqbKN2iEEAX3duqABJEgAzZBcIfAAxJHZ6BsqoTW09UISUazwXk+Wggun0+zaJhGUAA-GIJNJZPJKpZoatgd99A0dtC4cNRgTxgBpKCkKBTEDsa7eFaXG53BFPF5vLYoSpjIlLTrQ0bHNHeDGgn5rfrAXFQfGE4mkkjk6ZUmlzK63JD3Jmvd5eDlcwSEvmjOYkCAAN2QgiAA

💻 Code
type LiteralType = string | number | boolean;
type ValueGetter<ValueType extends LiteralType = LiteralType> = () => ValueType;

type Schema = SchemaArray | SchemaObject | LiteralType;
type SchemaArray = Array<SchemaObject | SchemaArray | LiteralType>;
type SchemaObject = {
  [key: string]: SchemaObject | SchemaArray | LiteralType;
};

type InferValuesFromSchema<S extends Schema> = S extends LiteralType
  ? ValueGetter<S>
  : S extends SchemaArray
  ? {
      [K in keyof S]: InferValuesFromSchema<S[K]>;
    }
  : S extends SchemaObject
  ? {
      [K in keyof S]: InferValuesFromSchema<S[K]>;
    }
  : never;
🙁 Actual behavior

an error is reported:

Type 'S[K]' does not satisfy the constraint 'Schema'.
  Type 'S[keyof S]' is not assignable to type 'Schema'.
    Type 'S[string] | S[number] | S[symbol]' is not assignable to type 'Schema'.
      Type 'S[string]' is not assignable to type 'Schema'.
        Type 'S[string]' is not assignable to type 'SchemaObject'.
          Type 'S[keyof S]' is not assignable to type 'SchemaObject'.
            Type 'S[K]' is not assignable to type 'SchemaObject'.
              Type 'S[keyof S]' is not assignable to type 'SchemaObject'.
                Type 'S[string] | S[number] | S[symbol]' is not assignable to type 'SchemaObject'.
                  Type 'S[string]' is not assignable to type 'SchemaObject'.(2344)
🙂 Expected behavior

There should be no error, S[K] should satisfy Schema constraint (at least since https://github.com/microsoft/TypeScript/pull/48837 )

Additional information about the issue

A variant with an additional type alias for that array branch works OK: TS playground.

主要语言
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 摘要。