Как описать такой тип в машинописном тексте?

#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);
    }
  };