我有一个打字稿界面,可以表示数据库中的数据,例如:
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;
您知道引用接口一部分的任何方法吗?
答案 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
,它是T
(K extends keyof T
)的密钥的一部分,那么{{1} }是该键T[K]
上T
的属性的类型。因此,如果您有一个K
类型的Foo["bar"]["fish"]
对象并读取了foo
,则您将得到Foo
类型。
在您的示例中,这是一个数组;如果您想要元素类型,则可以实现。数组具有数字index signature,因此,如果您拥有类型为foo.bar.fish
的键,则将获得元素类型。因此number
是该元素类型。
好的,希望能有所帮助;祝你好运!
答案 1 :(得分:1)
事不宜迟,我们可以使用查找类型语法['prop']
通过索引/键访问映射类型的成员类型
type FishArr = Foo['bar']['fish'];
数组类型也是映射类型Array<X> = {[k:number]: X}
,所以所有键都具有类型number
,然后以相同的方式从其他任何映射类型中获取成员类型,我们可以使用{{1} }用于数组类型元素
number