【问题标题】:Typescript types definitions - inheritance打字稿类型定义 - 继承
【发布时间】:2020-05-07 18:15:00
【问题描述】:

我有一个 typescript 界面来表示我在数据库中的数据,例如:

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;

你知道有什么方法可以引用接口的一部分吗?

【问题讨论】:

    标签: typescript types interface typescript-typings


    【解决方案1】:

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

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

    数组类型也是映射类型Array<X> = {[k:number]: X},所以所有的键都有一个类型number,那么通过同样的方式我们从任何其他映射类型中获取一个成员类型,我们可以使用number作为数组类型元素

    type Fish = Foo['bar']['fish'][number];
    

    【讨论】:

      【解决方案2】:

      是的,你想要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,它是T (K extends keyof T) 的键的一部分,那么T[K] 是@987654330 的属性的类型@ 在那个键 K。所以Foo["bar"]["fish"] 是你得到的类型,如果你有一个Foo 类型的foo 对象并读取foo.bar.fish

      这是您示例中的一个数组;如果你想要元素类型,你可以得到它。数组有一个数字index signature,所以如果你有一个number 类型的键,那么你会得到元素类型。所以Foo["bar"]["fish"][number] 就是那个元素类型。

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

      Playground link

      【讨论】:

      • 壮丽的。请注意,当存在相同元素的数组时,语法示例为:Foo['bar'][0]['obiwan'][0]['kenobi']
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2021-09-16
      • 2017-07-14
      • 2016-12-05
      • 1970-01-01
      • 2017-04-10
      • 2021-04-26
      相关资源
      最近更新 更多