TypeScript icon indicating copy to clipboard operation
TypeScript copied to clipboard

Conditional Type Inference Bug in TS 5.x

Open fxdave opened this issue 2 months ago • 1 comments

🔎 Search Terms

"Inference trims types", "inference excludes fields"

🕗 Version & Regression Information

  • This is not a crash
  • This changed between versions _4.9 and ___5.0
  • This changed in commit or PR _______
  • 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

https://www.typescriptlang.org/play/?#code/C4TwDgpgBAYg9nAPAFQHxQLxQN5QHYCGAthAFxQBEAZghVAL5QBkUyA3AFCiRQBCBAJxTosuAG4EANgFcyrBpy7hoyAJYATVRHXDM8iAA9gEPOoDOfQYlV4qEAVABq6APysNW9QH14SNFHJ2JR41TW0fBF0sZChDY1MLX2tbeydXeUDFKmk8AGNgVTg8KBo-VAAKXIAjQI9tYQBKHA4oKAEIYGkBYurOeg4OXKKzYDaIM2lJYABGPVLy3EIScmpaABooEjMzAgBzOQoACQgQAEI6RgJEyNwtnf3yEYEbXYZUBs52ianpgDoliBsKAAemBUAAogIBHABOQAArQyACUBQADkANRUHUcHG+Dgo0MqhGUCKUG40FRt3G9zkTxeQPoqIGQzwxK+k2AACY5ggFvhiAdShQNnc9gdjmcLh8OOyppz-gKgaCoAA5OCxKEwoA

💻 Code

type Foo<T> = { name: "foo" } & T;
type Bar<T> = { value: T };

type Tidied<T> = T extends Bar<infer V> ? Tidied_Foo<T> : T;
type Tidied_Foo<T> = T extends Foo<infer V> ? T : T;

function foo<T>(cb: Tidied<T>) {
  return cb;
}

const result1 = foo({ name: "foo", message: "Hey!" } as Foo<{ message: string }>);
result1.name; // Error: Property 'name' does not exist on type '{ message: string; }'

const result2 = foo({ name: "foo", message: "Hey!" });
result2.name; // No error

🙁 Actual behavior

packages/server/src/test.ts:13:9 - error TS2339: Property 'name' does not exist on type '{ message: string; }'.

13 result1.name; // ...
           ~~~~


Found 1 error in packages/server/src/test.ts:13

🙂 Expected behavior

no type error

Additional information about the issue

I was working on my project Cuple. I found a weird bug. I spent my day to provide a small minimal example. I have a type Tidied which is used to make a developer friendly type from the complex built response types. It worked well for some cases but it doesn't work for the case that I provided. The original version makes more sense.

fxdave avatar May 13 '24 20:05 fxdave