打字稿类型定义-继承

时间:2020-01-21 16:22:08

标签: typescript types interface typescript-typings

我有一个打字稿界面,可以表示数据库中的数据,例如:

interface Foo {
  bar: {
    fish: {
       _id: string,
       name: string,
    }[],
  },

  starwars: string[],
}

我希望能够引用此界面的某些部分。在下面的示例中,我想将键fish后面的数据作为参数传递。

我成功地使其正常运行:

interface Fish {
  _id: string,
  name: string,
}

interface Foo {
  bar: {
    fish: Fish[],
  },

  starwars: string[],
}

function killTheFish(fish: Fish) { ... }

但是我更喜欢做类似的事情:

type Fish = Foo.bar.fish;

您知道引用接口一部分的任何方法吗?

2 个答案:

答案 0 :(得分:3)

是的,您想要lookup types, aka indexed access types。它使用方括号表示法代替点表示法(这会与名称空间冲突):

type FishArray = Foo["bar"]["fish"]
/*
type FishArray = {
    _id: string;
    name: string;
}[]
*/

type Fish = Foo["bar"]["fish"][number];
/* type Fish = {
    _id: string;
    name: string;
} */

如果您有一个属性类型T和一个类似密钥的类型K,它是TK extends keyof T)的密钥的一部分,那么{{1} }是该键T[K]T的属性的类型。因此,如果您有一个K类型的Foo["bar"]["fish"]对象并读取了foo,则您将得到Foo类型。

在您的示例中,这是一个数组;如果您想要元素类型,则可以实现。数组具有数字index signature,因此,如果您拥有类型为foo.bar.fish的键,则将获得元素类型。因此number是该元素类型。

好的,希望能有所帮助;祝你好运!

Playground link

答案 1 :(得分:1)

事不宜迟,我们可以使用查找类型语法['prop']通过索引/键访问映射类型的成员类型

type FishArr = Foo['bar']['fish'];

数组类型也是映射类型Array<X> = {[k:number]: X},所以所有键都具有类型number,然后以相同的方式从其他任何映射类型中获取成员类型,我们可以使用{{1} }用于数组类型元素

number