当前位置: 首页 > 知识库问答 >
问题:

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

桂高义
2023-03-14

假设有一个类库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;

但这样一来,我就有了让它和库中的一个保持最新的负担,而且它可能非常大,并导致大量代码重复。

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

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

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

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

共有3个答案

薛钧
2023-03-14

接口类似于对象的定义。那么y是I2对象的一个属性,它是某种类型的,在这种情况下是“匿名的”。

您可以使用另一个接口来定义y,然后像这样将其用作y类型

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

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

您可以将接口放在一个文件中并使用extract,以便将其导入到项目的其他文件中

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



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

您可以这样导入它:

   import {I1, I2, ytype} from 'your_file'
洪德寿
2023-03-14

要扩展已接受的答案,您还可以使用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 };
唐涛
2023-03-14

这在以前是不可能的,但幸运的是,自从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游乐场中查看它。

 类似资料:
  • 问题内容: 假设我有以下情况: 有没有一种方法可以保证实现的任何类也必须扩展?我不想创建一个抽象类,因为我希望能够以类似的方式混合其他一些接口。 例如: 问题答案: Java接口无法扩展类,这很有意义,因为类包含无法在接口内指定的实现细节。 解决此问题的正确方法是通过将接口也完全从实现中分离出来。所述等可以扩展接口以迫使程序员来实现相应的方法。如果要在所有实例之间共享代码,则可以将(可能是抽象的)

  • 我知道在摇摆中,您可以使用父窗口打开子窗口/对话框/框架,并且子窗口将具有与父窗口相同的属性,例如共享左上角的徽章。JavaFX 8中是否有任何类似的功能?这会创建一个新窗口,但没有任何共享信息的父窗口(甚至可以关闭父窗口,而子窗口不会关闭): 注意:我已经阅读了JavaFX2.0FXML子窗口和JavaFXOpenNewWindow。

  • 有没有办法只在满足条件时才在Javafx中“渲染”组件?我有兴趣做一个具有不同角色的用户界面,如果角色允许,只需添加一个组件,我也想继续使用FXML。我没有读过类似的东西。

  • 问题描述 我想在Type cript中的接口中定义两个可选属性。这两个属性中的一个并且只有一个必须存在于此接口的实例对象中。 我试过什么 当前解决方案的问题 虽然当前解决方案确保必须存在两个属性之一,即和,但它不会使它们相互排斥。也就是说,和都可能存在于实例对象中,它仍然会通过当前接口检查。 问题示例 以下是 接口实例的示例,其中对象同时包含和,并且 linter 仍然不显示任何错误:

  • 问题内容: 目前我有这样的事情 main.go 还有我的工作包 和 我正在传递给NewJob的函数是在goroutine上每2秒执行一次,但是我想访问我传递的匿名结构…但是当我尝试访问时 编号 我越来越 t.Id未定义(类型interface {}是没有方法的接口) 但是打印t给我预期的结果 {1} 问题答案: 您必须先将其声明为兼容类型,然后才能访问其字段。

  • 问题内容: 首先,我阅读了埃里克森对“为什么不能在Java接口中定义静态方法?”的有用答复。。这个问题不是关于“为什么”的问题,而是关于“然后如何做”的问题。 编辑:我的原始示例不适当地,但我将其保留在下面。 虽然我现在确信在大多数情况下我想做的是过度矫kill过正,但在一种情况下可能需要这样做: 我再举一个例子。现在,让我们采用一个适合于查找表的复杂功能,例如Bessel函数。这必须进行初始化,