如何检查我的财产是否存在类型

时间:2018-11-08 21:16:31

标签: typescript

据我们所知,打字稿允许我们声明部分类型,但是当我们要检查我的属性是否在Typeof中时会怎样呢? 让我们看看

interface Car {
   Brand: string;
   Model: string;
}

type KeyofCar = keyof Car; // Brand, Model

if('Brand' is in KeyofCar) {
   something...
} // I know it doesn't work but it is pseudocode

有什么办法找出答案吗?

3 个答案:

答案 0 :(得分:1)

我不确定您要在这里做什么。在您的问题中,您知道在编译时'Brand'中的keyof Car 。那你为什么要检查呢?

我可以想象如果类型不是完全未知的,那么尝试做类似的事情,例如在类型参数中……

function<T>(foo: T) {
  if('bar' in keyof T) {
    // do something...
  }
}

我想说您不会尝试通过将某些内容与keyof T进行比较来解决该问题。而是尝试做这样的事情

interface Car {
  Brand: string;
  Model: string;
}

interface Bus {
  Passengers: number;
  Color: string;
}

function(foo: Car | Bus) {
  if('Brand' in foo) {
    // foo is a Car
  } else {
    // foo is a Bus
  }
}

如果您真的想使用按键来做某事,则可以做这样的事

type CarKey = keyof Car;
const carKeys: CarKey[] = ['Brand', 'Model'];

function(key: string) {
  if(carKeys.includes(key)) {
    // do thing
  }
}

答案 1 :(得分:0)

在撰写本文时,还没有一种方法可以在运行时严格使用Typescript机制进行检查。尽管您可以做的是一个丑陋的骇客,但是您可以创建一个Record,然后从中提取密钥。

interface Car {
   Brand: string;
   Model: string;
}

const carRecord: Record<keyof Car, boolean> = {
  Brand: true,
  Model: true
}

if (carRecord['Brand']) {
  something...
}

执行Record的原因是因为每次更改界面时,还必须更改Record。否则,Typescript将抛出编译错误。至少这可以确保随着Car接口的增长,检查将保持一致。

答案 2 :(得分:0)

type CheckPropExists<T extends {[x:string]:any},Prop extends string> = T[Prop] extends undefined ? false : true;
//Example
type Result = CheckPropExists<{a:string;b:number;},"a">;
//Result is true