有没有办法“提取” TypeScript 接口属性的类型?

新手上路,请多包涵

假设库 X 有一个类型文件,其中包含一些接口。

 interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

为了使用这个库,我需要传递一个与 I2.y 完全相同类型的对象。我当然可以在我的源文件中创建相同的界面:

 interface MyInterface {
    a: I1,
    b: I1,
    c: I1
}

let myVar: MyInterface;

但是随后我承担了将其与库中的更新保持同步的负担,而且它可能非常大并导致大量代码重复。

因此,有没有办法“提取”接口的这个特定属性的类型?类似于 let myVar: typeof I2.y 的东西(不起作用并导致“找不到名称 I2”错误)。


编辑:在 TS Playground 中玩了一会儿后,我注意到以下代码完全实现了我想要的:

 declare var x: I2;
let y: typeof x.y;

但是,它需要声明一个冗余变量 x 。我正在寻找一种在没有该声明的情况下实现这一目标的方法。

原文由 Kuba Jagoda 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 926
2 个回答

以前不可能,但幸运的是现在可以了,因为 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

TypeScript Playground%3B%0D%0A) 中查看。

原文由 Michał Miszczyszyn 发布,翻译遵循 CC BY-SA 3.0 许可协议

只是从 联合对象类型 中提取文字类型的示例:

 type Config = {
    key: "start_time",
    value: number,
} | {
    key: "currency",
    value: string,
}

export type ConfigKey = Config["key"];
// "start_time"|"currency"

原文由 James Bond 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进