简体   繁体   English

如何在 TypeScript 中描述这样的类型?

[英]How to describe type like this in TypeScript?

As below, personParam is always number | { name: string; }如下, personParam总是number | { name: string; } number | { name: string; } number | { name: string; } in func , but I hope it's type can be determined by key 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);
  }
};

One solution is using a type predicates一种解决方案是使用类型谓词

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';
}

TypeScript Playground 打字稿游乐场

I don't know if this way can be useful for you.不知道这个方法对你有没有用。 But check this out.但是看看这个。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM