type Animal = { name: string } // imported from 3rd party module
const cat: Animal = {
name: 'Cat' as const,
}
const dog = {
name: 'Dog' as const
}
type CatName = typeof cat.name // = string, not 'Cat' !!!
type DogName = typeof dog.name // = 'Dog'
In above code, how can I get a literal type CatName = 'Cat' (like DogName = 'Dog')?
Note: I can’t change the definition of type Animal because it’s 3rd party code, and I’d like to keep the value cat to be typed.
>Solution :
and I’d like to keep the value cat to be typed
If you explicitly type cat as Animal, then no, you can’t get 'Cat' out. You can type it more precisely const cat: { name: 'Cat' } (which is a subtype of Animal) or even const cat: Animal & { name: 'Cat' } if you want to be explicit it’s an Animal.