打字稿类型定义 - 继承

Posted

技术标签:

【中文标题】打字稿类型定义 - 继承【英文标题】: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;

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

【问题讨论】:

【参考方案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']

以上是关于打字稿类型定义 - 继承的主要内容,如果未能解决你的问题,请参考以下文章

从类型联合定义打字稿函数签名[重复]

从打字稿类型定义文件中导出枚举

打字稿错误:类型“文档 []”不可分配给自定义类型

打字稿:与基本类型平行的自定义类型被忽略

如何在打字稿中正确导入自定义类型

使用反应成帧器类型'()=> void'的打字稿错误不可分配给类型'未定义'