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