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

时间:2016-03-30 14:06:35

标签: typescript typing definitelytyped

我们假设有一个包含一些接口的库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。我正在寻找一种方法来实现这一目标。

3 个答案:

答案 0 :(得分:69)

以前不可能,但幸运的是,现在是TypeScript version 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中查看。

答案 1 :(得分:7)

要扩展已接受的答案,您还可以使用 type 关键字指定类型并在其他地方使用。

// Some obscure library
interface A {
  prop: {
    name: string;
    age: number;
  }
}

// Your helper type
type A_Prop = A['prop']

// Usage
const myThing: A_prop = { name: 'June', age: 29 };

答案 2 :(得分:0)

接口就像对象的定义。然后y是你的I2对象的属性,属于某种类型,在这种情况下" anonymous"。

您可以使用其他界面来定义y,然后将其用作y类型,如此

interface ytype {
   a: I1;
   b: I1;
   c: I1;
}

interface I2 {
    y: ytype;
    z: any;
}

您可以将界面放在文件中并使用数据提取,以便将其导入到项目的其他文件中

export interface ytype {
   a: I1;
   b: I1;
   c: I1;
}



 export interface I2 {
        y: ytype;
        z: any;
    }

您可以这样导入:

   import {I1, I2, ytype} from 'your_file'