I want to get the actual keys of "myObj", but also ensure its type. If I add a type I no longer get the actual keys. How can i do both?
example 1
const myObj = {
in01: 'Hello',
in02: 'World'
}
type actualKeys = keyof typeof myObj // result: "in01" | "in02" (this is what I want)
example 2
type myType = {
[x: string]: string
}
const myObj: myType = { // I get to validate the type (what I want)
in01: 'Hello',
in02: 'World'
}
type actualKeys = keyof typeof myObj // result: string | number (this is no longer the actual keys. Not what I want)
CodePudding user response:
Your Indexable type myType
allows number as keys.
Therefore keyof myType
returns string | number
Since you define myObj
to be of type myType
, keyof typeof myObj
is the same as keyof myType
, hence the string | number
.
With TS 4.9 (yet to be released), you will be able to ensure the type without actually typing it using the satisfies
keyword.
type myType = {
[x: string]: string
}
const myObj = { // ok
in01: 'Hello',
in02: 'World'
} satisfies myType
const myObj2 = { // KO
in01: 'Hello',
in02: 'World'
0: 'lala', // nope
} satisfies myType
type actualKeys = keyof typeof myObj