#javascript #typescript
Вопрос:
Как показано ниже, personParam
всегда number | { name: string; }
func
включен , но я надеюсь, что его тип можно определить по ключу
type Params = {
jack: number;
tom: {name: string};
};
const func = <K extends keyof Params>(key: K, personParam: Params[K]) => {
switch (key) {
case 'jack':
console.log(personParam);
case 'tom':
// I hope personParams to be {name: string} type, but unfortunately it's number | { name: string; }
// TS2339: Property 'name' does not exist on type 'number | { name: string; }'. Property 'name' does not exist on type 'number'.
console.log(personParam.name);
}
};
Ответ №1:
Одним из решений является использование предикатов типа
type Params = {
jack: number;
tom: {name: string};
};
const func = <K extends keyof Params>(key: K, personParam: Params[K]) => {
if(isTom(key, personParam)) {
console.log(personParam.name);
} else {
console.log(personParam);
}
};
function isTom(k: keyof Params, personParam: Params[keyof Params]): personParam is {name: string} {
return k === 'tom';
}
Комментарии:
1. Спасибо за это замечательное решение, но я чувствую, что оно требует много дополнительного кода, интересно, есть ли более простое решение
Ответ №2:
Я не знаю, может ли этот способ быть вам полезен. Но посмотри на это.
type Params = {
jack: number;
tom: {name: string};
};
const func = <K extends keyof Params>(personParam: Params[K]) => {
if(typeof(personParam) === 'object') {
personParam.name;
} else {
console.log(personParam);
}
};