const test = {
a: '1',
b: '2',
c: '3',
};
type KEYS = keyof typeof test;
const getType = (props: KEYS | string) => {
const receivedType =
test[props] === typeof test
? test[recordType]
: '4';
}
i want to check if props is typeof test i will return test[props] but props doesn't include typeof test i want to return 4
I don't know how to deal with the string case.
what is wrong in my code?
CodePudding user response:
If I understood you correctly, you're trying to check if the argument props is a key of the object test. You can't check types during runtime like in test[props] === typeof test.
But something like this will check if props is a key of the object test
const test = {
a: '1',
b: '2',
c: '3',
};
type KEYS = keyof typeof test;
const getType = (props: KEYS | string) => {
let isKey = Object.keys(test).includes(props);
const receivedType = isKey ? test[props] : '4';
}
CodePudding user response:
The first observation is that the union KEYS | string will just simplify to string. If you want to provide hints about the correct properties to pass in but still allow any string you can use KEYS | (string & {}) which will not reduce to string (looks strange, is not documented, but works)
The second part is that since test has a type and you want to index it with any string you will need to use a type assertion to get it to work. Also for testing the property you could just use the in operator:
const getType = (props: KEYS | (string & {})) => {
const receivedType =
props in test
? (test as Record<string, string>)[props]
: '4';
}
