We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TypeScript Version: 3.2.2
Search Terms: string literal type infer
Code
type MethodNamesFrom<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T] const obj = { a: () => { }, b: () => { }, c: 2 } // CASE 1: PROBLEM? function Infer1<TObject, TKey extends MethodNamesFrom<TObject>>(o: TObject, k: TKey) { } Infer1(obj, 'a') // TKey infer "a" | "b" // CASE 2: OK function Infer2<TKey extends MethodNamesFrom<typeof obj>>(k: TKey) { } Infer2('a') // TKey infer "a" // CASE 3: OK, explicity define generic types Infer1<typeof obj, 'a'>(obj, 'a') // TKey infer "a" // CASE 4: OK, explicity define "a" as "a" Infer1(obj, 'a' as 'a') // TKey infer "a" // CASE 5: OK, enforces string in TKey function Infer3<TObject, TKey extends string & MethodNamesFrom<TObject>>(o: TObject, k: TKey) { } Infer3(obj, 'a') // TKey infer "a"
Expected behavior: Infer TKey as "a" | "b" in case 1
TKey
"a" | "b"
Actual behavior: Should infer TKey as "a"
"a"
Playground Link: https://www.typescriptlang.org/play/index.html#src=type%20MethodNamesFrom%3CT%3E%20%3D%20%7B%0D%0A%20%20%5BK%20in%20keyof%20T%5D%3A%20T%5BK%5D%20extends%20Function%20%3F%20K%20%3A%20never%0D%0A%7D%5Bkeyof%20T%5D%0D%0A%0D%0Aconst%20obj%20%3D%20%7B%0D%0A%20%20a%3A%20()%20%3D%3E%20%7B%20%7D%2C%0D%0A%20%20b%3A%20()%20%3D%3E%20%7B%20%7D%2C%0D%0A%20%20c%3A%202%0D%0A%7D%0D%0A%0D%0A%2F%2F%20PROBLEM%3F%0D%0Afunction%20Infer1%3CTObject%2C%20TKey%20extends%20MethodNamesFrom%3CTObject%3E%3E(o%3A%20TObject%2C%20k%3A%20TKey)%20%7B%0D%0A%0D%0A%7D%0D%0A%0D%0AInfer1(obj%2C%20'a')%20%2F%2F%20TKey%20infer%20%22a%22%20%7C%20%22b%22%0D%0A%0D%0A%2F%2F%20OK%0D%0Afunction%20Infer2%3CTKey%20extends%20MethodNamesFrom%3Ctypeof%20obj%3E%3E(k%3A%20TKey)%20%7B%0D%0A%0D%0A%7D%0D%0A%0D%0AInfer2('a')%20%2F%2F%20TKey%20infer%20%22a%22%0D%0A%0D%0A%0D%0A%2F%2F%20OK%2C%20explicity%20define%20generic%20types%0D%0AInfer1%3Ctypeof%20obj%2C%20'a'%3E(obj%2C%20'a')%20%2F%2F%20TKey%20infer%20%22a%22%0D%0A%0D%0A%2F%2F%20OK%2C%20explicity%20define%20%22a%22%20as%20%22a%22%0D%0AInfer1(obj%2C%20'a'%20as%20'a')%20%2F%2F%20TKey%20infer%20%22a%22%0D%0A%0D%0A%2F%2F%20OK%2C%20enforces%20string%20in%20TKey%0D%0Afunction%20Infer3%3CTObject%2C%20TKey%20extends%20string%20%26%20MethodNamesFrom%3CTObject%3E%3E(o%3A%20TObject%2C%20k%3A%20TKey)%20%7B%0D%0A%0D%0A%7D%0D%0A%0D%0AInfer3(obj%2C%20'a')%20%2F%2F%20TKey%20infer%20%22a%22%0D%0A
Related Issues:
The text was updated successfully, but these errors were encountered:
Further context: https://twitter.com/gt_katakura/status/1083744926226100225
Sorry, something went wrong.
Just to notify here that at least versions 3.3.3+ doesn't have more this bug. I think this issue can be closed.
This was fixed in #29478, yes.
No branches or pull requests
TypeScript Version: 3.2.2
Search Terms: string literal type infer
Code
Expected behavior: Infer
TKey
as"a" | "b"
in case 1Actual behavior: Should infer
TKey
as"a"
Playground Link: https://www.typescriptlang.org/play/index.html#src=type%20MethodNamesFrom%3CT%3E%20%3D%20%7B%0D%0A%20%20%5BK%20in%20keyof%20T%5D%3A%20T%5BK%5D%20extends%20Function%20%3F%20K%20%3A%20never%0D%0A%7D%5Bkeyof%20T%5D%0D%0A%0D%0Aconst%20obj%20%3D%20%7B%0D%0A%20%20a%3A%20()%20%3D%3E%20%7B%20%7D%2C%0D%0A%20%20b%3A%20()%20%3D%3E%20%7B%20%7D%2C%0D%0A%20%20c%3A%202%0D%0A%7D%0D%0A%0D%0A%2F%2F%20PROBLEM%3F%0D%0Afunction%20Infer1%3CTObject%2C%20TKey%20extends%20MethodNamesFrom%3CTObject%3E%3E(o%3A%20TObject%2C%20k%3A%20TKey)%20%7B%0D%0A%0D%0A%7D%0D%0A%0D%0AInfer1(obj%2C%20'a')%20%2F%2F%20TKey%20infer%20%22a%22%20%7C%20%22b%22%0D%0A%0D%0A%2F%2F%20OK%0D%0Afunction%20Infer2%3CTKey%20extends%20MethodNamesFrom%3Ctypeof%20obj%3E%3E(k%3A%20TKey)%20%7B%0D%0A%0D%0A%7D%0D%0A%0D%0AInfer2('a')%20%2F%2F%20TKey%20infer%20%22a%22%0D%0A%0D%0A%0D%0A%2F%2F%20OK%2C%20explicity%20define%20generic%20types%0D%0AInfer1%3Ctypeof%20obj%2C%20'a'%3E(obj%2C%20'a')%20%2F%2F%20TKey%20infer%20%22a%22%0D%0A%0D%0A%2F%2F%20OK%2C%20explicity%20define%20%22a%22%20as%20%22a%22%0D%0AInfer1(obj%2C%20'a'%20as%20'a')%20%2F%2F%20TKey%20infer%20%22a%22%0D%0A%0D%0A%2F%2F%20OK%2C%20enforces%20string%20in%20TKey%0D%0Afunction%20Infer3%3CTObject%2C%20TKey%20extends%20string%20%26%20MethodNamesFrom%3CTObject%3E%3E(o%3A%20TObject%2C%20k%3A%20TKey)%20%7B%0D%0A%0D%0A%7D%0D%0A%0D%0AInfer3(obj%2C%20'a')%20%2F%2F%20TKey%20infer%20%22a%22%0D%0A
Related Issues:
The text was updated successfully, but these errors were encountered: