假设库 X 有一个类型文件,其中包含一些接口。
interface I1 { x: any; } interface I2 { y: { a: I1, b: I1, c: I1 } z: any }
为了使用这个库,我需要传递一个与I2.y. 我当然可以在我的源文件中创建相同的界面:
I2.y
interface MyInterface { a: I1, b: I1, c: I1 } let myVar: MyInterface;
但是随后我承担了将其与库中的更新保持同步的负担,而且它可能非常大并导致大量代码重复。
因此,有没有办法“提取”接口的这个特定属性的类型?类似于let myVar: typeof I2.y(不起作用并导致“找不到名称 I2”错误)。
let myVar: typeof I2.y
编辑 :在 TS Playground 中玩了一会儿后,我注意到以下代码完全符合我的要求:
declare var x: I2; let y: typeof x.y;
但是,它需要x声明一个冗余变量。我正在寻找一种在没有该声明的情况下实现这一目标的方法。
x
以前不可能,但幸运的是现在可以了,因为TypeScript 版本 2.1。它已于 2016 年 12 月 7 日发布,它引入了 索引访问类型 ,也称为 查找类型 。
语法看起来与元素访问完全一样,但它是代替类型编写的。所以在你的情况下:
interface I1 { x: any; } interface I2 { y: { a: I1, b: I1, c: I1 } z: any } let myVar: I2['y']; // indexed access type
现在myVar有I2.y.
myVar
在TypeScript Playground中查看。