Edit Sep 2022:
With Typescript 4.9 we can now use satisfies operator:
type MyType = { name: string }
const x ={
name: 'test', // Autocompleted, typesafe
} as const satisfies MyType
x.name // type is 'test' (not string)
And if for some reason, you can’t use satisfies, it’s fairly easy to replicate the same behavior:
/**
* Replacement for TS satisfies operator, until it's well supported
* Usage:
* const test = satisfy<{ a: string }>()({ a: 'test', b: 'test' })
* */
export function satisfy<TSatisfied>(): <T extends TSatisfied>(value: T) => T {
return (value) => value
}
Previous solution:
Here is a way to achieve what you want:
type MyType = { name: string }
// This function does nothing. It just helps with typing
const makeMyType = <T extends MyType>(o: T) => o
const x = makeMyType({
name: 'test', // Autocompleted, typesafe
} as const)
x.name // type is 'test' (not string)