Issue
The below describes what I'd like to do:
interface Customer {
name: string;
age: number;
}
const getCustomer = () => {
return {
name: 'bob',
age: 42
}
}
export const getValue = (key: keyof Customer): typeof Customer[key] => {
const customer = getCustomer();
return customer[key];
};
but the TS compiler doesn't like the line typeof Customer[key]. I could make this any or string | number, but I should be able to get the type from this. For example, if I write:
getValue('name') what does it return? You know without any runtime information, it returns a string. What if I write getValue('age')? A number of course. getValue(someInputVal as any) might return string or number, but all of this is perfectly available at compile time. So - is there a way to get this from typescript?
Solution
you can slightly rewrite your function to use a generic:
export function getValue<T extends keyof Customer>(key: T): Customer[T] {
const customer = getCustomer();
return customer[key];
};
what this is essentially saying is that getValue should only accept an argument that extends the keys of the Customer interface and it will return the associated type with that T key from the interface.
here is a ts playground link with the example solution i suggested
Answered By - Yash
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.