Microsoft/TypeScript

Inferred type is not the same as what's passed in original generic type.

Open

#42,516 创建于 2021年1月27日

在 GitHub 查看
 (6 评论) (0 反应) (0 负责人)TypeScript (48,455 star) (6,726 fork)batch import
BugDomain: check: Type InferenceEffort: DifficultHelp Wanted

描述

Bug Report

🔎 Search Terms

infer, generic

🕗 Version & Regression Information

  • This is a crash
  • This changed between versions _________ and _________
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about infer.
  • I was unable to test this on prior versions because _______

⏯ Playground Link

https://www.typescriptlang.org/play?ts=4.1.3#code/C4TwDgpgBACgTgezAYQQOwM7DgVwMbAJwA8AKlALxQCGaIAfJQFBRQA+UA3lGhAO5QAFADpR1OAHMMALhp0A2gF0AlLPIAyKAgBGAKwgEoAXxbsuQ1VHImmoSFACyIAJJoAZhBKlGVchAAewBBoACYYsIgo6Fi4BETEAJbunlAAaowA-GlQsgDk-gW5TLbg0KnllEKCypSMMUkSNRyC1bU8OAC22p7KxXbQABqVTq4eJPBIqJjY+IQk5en0TEA

Playground link with relevant code

💻 Code

// The variable names are meaningless, they are simplified from vue project.
type PropConstructor<T = any> =
  | { new (...args: any[]): T & object }
  | { (): T }

type MyInfer<T> = T extends PropConstructor<infer V> ? V : 'xxx'

type VVV = (() => string) | (() => number)

type X = MyInfer<PropConstructor<VVV>>

🙁 Actual behavior

type X = (() => string) | (() => number) | ((() => string) & object) | ((() => number) & object)

🙂 Expected behavior

type X = (() => string) | (() => number))

贡献者指南