Closed
Description
TypeScript Version: 2.6.2
Code
interface MyIFace {
key1: string
key2: number
}
const MyObject: {[K in keyof MyIFace]: string} = {
key1: 'foo',
key2: 'bar'
}
declare function someFunction(key: keyof MyIFace): void
// error: Argument of type 'string' is not assignable to parameter of type '"key1" | "key2"'
Object.keys(MyObject).forEach(key => someFunction(key))
// error: Type 'string' is not assignable to type '"key1" | "key2"'
Object.keys(MyObject).forEach((key: keyof MyIFace) => someFunction(key))
Object.keys(MyObject).forEach((key: keyof typeof MyObject) => someFunction(key))
Expected behavior:
Object.keys(MyObject)
should type it's return as (keyof typeof MyObject)[]
.
Actual behavior:
Object.keys(MyObject)
types it's return as string[]
.
This can be easily fixed by defining Object.keys
as follow :
declare const BetterObject: {
keys<T extends {}>(object: T): (keyof T)[]
}
// OR
declare const BetterObject: {
keys(object: {}): (keyof typeof object)[]
}
// everything works and key is infered as "key1" | "key2"
BetterObject.keys(MyObject).forEach(key => someFunction(key))
BetterObject.keys(MyObject).forEach((key: keyof MyIFace) => someFunction(key))
BetterObject.keys(MyObject).forEach((key: keyof typeof MyObject) => someFunction(key))