Let's say I have the following type:
type Device = {
name: string;
model: string;
}
type Service {
name: string;
device: Device;
}
Let's say I want a generic object Pair having a key and a func property. The key should be an existing field on the given generic type T and func (optional parameter) should be a function that receives a single parameter being the value received by indexing T with key. How do you actually type func properly?
interface Pair<T> {
key: keyof T;
func?: (value: ?) => ?
}
I tried having something like func: (value: T[key]) => typeof T[key]
but I'm not sure what's the right approach.
Expected behaviour:
p: Pair<Device> = { key: "name", func: (value) => ...}
, value should be inferred as being a stringp: Pair<Service> = { key: "device", func: (value) => ...}
, value should be inferred as being a deviceExtra:
What if I want to have a function that receives an array of these kind of pairs? How would the type of that parameter look like?
You just need another generic parameter to "connect" the key and value types of the interface:
type Device = {
name: string;
model: number;
}
interface Pair<T, K extends keyof T> {
key: K,
func: (value: T) => T[K]
}
Might as well remove the function parameter:
interface Pair<T, K extends keyof T> {
func: (value: T) => T[K]
}
const pair: Pair<Device, 'model'> = {
// key: 'model',
func: (value) => ''
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With