让我们假设有一个库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
。我正在寻找一种方法来实现这一点没有声明。
6条答案
按热度按时间utugiqy61#
这在以前是不可能的,但幸运的是,自从TypeScript version 2.1以来,现在已经可以了。它于2016年12月7日发布,并引入了索引访问类型,也称为查找类型。
语法看起来像元素访问,但写在类型的地方。所以在你的例子中:
字符串
myVar
的类型为I2.y
。在TypeScript Playground中查看。
shyt4zoc2#
要扩展已接受的答案,您还可以使用
type
关键字分配类型并在其他地方使用它。字符串
ergxz8rk3#
这是一个从union对象类型中提取文字类型的例子:
字符串
8xiog9wr4#
keyof Colors
将返回所有键"white" | "black"
的列表。当这个键列表被传递到Colors接口时,类型将是给定键"#fff" | #000
的所有值。字符串
c90pui9n5#
字符串
vngu2lb86#
一个接口就像一个对象的定义。那么y是你的I2对象的一个属性,它是一个特定的类型,在这种情况下是“匿名”的。
你可以用另一个接口来定义y,然后像这样把它作为y类型
字符串
你可以把你的接口放在一个文件中,然后使用extract,这样你就可以把它导入到你项目的其他文件中
型
你可以这样导入:
型