有没有什么方法可以在 Typescript 中指定对象的类型,其中叶子都是一种类型,但键名称是灵活的?

roc*_*oco 0 typescript typescript-typings

无法想出一个简单的方法来表达标题,一个例子应该更清楚:

假设我有一个界面:

interface Vehicle {
  color: string;
  year: number;
}
Run Code Online (Sandbox Code Playgroud)

现在我有两个对象:

const FIRST = {
  cars: {
    a: {color: "red", year: "1980"},
    b: {color: "blue", year: "1991"}
  },
  trucks: {
    red_trucks: {
      c: {color: "red", year: "1990"}
    }
  }
}

const SECOND = {
  collection: {
    new_cars: {
      x: {color: "green", year: "2015"},
      y: {color: "blue", year: "2019"}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

对象中键的名称和结构不同 - FIRSThascars->a, btrucks->red_trucks- cwhile SECONDjust has collection->new_cars->x, y。假设有很多这样的对象,它们都有不同的键名。

但它们仍然有点相似,因为实际上对象只是存储Vehicles,但它碰巧嵌套了一些对象来做到这一点。

有没有办法在这里指定一个类型,类似于“我们不知道键,但每个键的值是另一个具有更多键的对象或” Vehicle?某种递归类型?

Lin*_*ste 5

描述这一点的类型实际上是一个相当简单的映射类型

type Tree<T> = {
  [key: string]: T | Tree<T> | undefined
}
Run Code Online (Sandbox Code Playgroud)

我已经将其写为通用的,但T在您的情况下将是Vehicle. 对于对象的每个属性Tree,我们说该值是 a Vehicle、 anotherTree<Vehicle>undefined。我之所以将其包括在内,undefined是因为在运行时您会假设并非每个属性都已定义。您应该检查您是否确实具有价值。

你的两个例子都可以分配给Tree<Vehicle>. 去游乐场看看吧。