I'd like to define the following function:
getStringValidation<FormValues>("name")
and have the following constraints:
FormValues
is an object that contains the"name"
key (or whatever the argument is)- The value that corresponds to this key in the object should be of type
string
.
For example:
Allowed
getStringValidation<{ name: string, age: number }>("name")
Should error
getStringValidation<{ name: string, age: number }>("age") // the value is of type number
getStringValidation<{ name: string, age: number }>("address") // the key doesn't exist in the object
How could I achieve this?
CodePudding user response:
Say you define a type:
type KeysOfType<O, T> = {
[K in keyof O]: O[K] extends T ? K : never;
}[keyof O];
to extract the keys of O
that have values of type T
, then defining your function is straightforward:
function getStringValidation<T>(propName: KeysOfType<T, string>) {
throw Error("not implemented")
}