Closed
Description
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
Actual behavior: Should infer TKey
as "a"
Related Issues: