Typescript 从类中提取属性和方法的特定类型并将其添加到接口

Typescript 从类中提取属性和方法的特定类型并将其添加到接口,typescript,typescript-typings,typescript-generics,conditional-types,Typescript,Typescript Typings,Typescript Generics,Conditional Types,您好,打字脚本专业人士。我不想要一个解决方案,但一个提示,如果这在Typescript中是可能的。我对条件类型仍然比较熟悉。是否可以将属性和方法的类型从类提取到接口 interface ExtractTypings<Class, MembersOrMethods> { // ????? } class Bar { a: boolean; b: number; c() { return 'some string'; } d() {} e() {

您好,打字脚本专业人士。我不想要一个解决方案,但一个提示,如果这在Typescript中是可能的。我对条件类型仍然比较熟悉。是否可以将属性和方法的类型从类提取到接口

interface ExtractTypings<Class, MembersOrMethods> {
  // ?????
}

class Bar {
  a: boolean;
  b: number;
  c() {
    return 'some string';
  }
  d() {}
  e() {
    return new Observable<number>();
  }
}

class Foo implements ExtractTypings<Bar, ['a, c, e']> {

}
接口抽取类型{
// ?????
}
分类栏{
a:布尔型;
b:数字;
c(){
返回'somestring';
}
d(){}
e(){
返回新的可观察();
}
}
类Foo实现提取类型{
}

Typescript的版本:3.4.5

您不需要条件类型,内置映射类型
Pick
应该实现以下功能:


class Bar {
  a: boolean;
  b: number;
  c() {
    return 'some string';
  }
  d() {}
  e() {
    return new Observable<number>();
  }
}

class Foo implements Pick<Bar, 'a' |  'c' |  'e'> {

}

分类栏{
a:布尔型;
b:数字;
c(){
返回'somestring';
}
d(){}
e(){
返回新的可观察();
}
}
类Foo实现Pick{
}

如果我正确理解您的意图,您可以这样做:

type ExtractTypings<Class, MembersOrMethods extends (keyof Class)[]> =
Pick<Class, MembersOrMethods[number]>;

class Bar {
  a: boolean;
  b: number;
  c() {
    return 'some string';
  }
  d() {}
  e() {
    return new Observable<number>();
  }
}

class Foo implements ExtractTypings<Bar, ['a', 'c', 'e']> {

}
类型提取键入=
挑选;
分类栏{
a:布尔型;
b:数字;
c(){
返回'somestring';
}
d(){}
e(){
返回新的可观察();
}
}
类Foo实现提取类型{
}

请注意,如果您不需要将成员声明为数组,提香·德拉戈米尔(Titian Dragomir)的解决方案更可取。

更新:我发现了这两个很棒的类型库,它将typescript的内置类型(拾取、排除、提取、合并等)的数量增加到更有用的类型(例如头、尾、尾等……):

还要提到这篇帮助我理解如何构建自己的复杂类型的好文章:

  • (ts工具带的所有者)

注意:我还发现,要构建的这些复杂类型的核心实际上只是
扩展
类型
推断

我不知道它会与Pick一起工作,所以我想展示我想要的用法。你能解释一下它的作用吗:MembersOrMethods[数字]!number在这里做什么?它创建了
MembersOrMethods
所有元素类型的并集,因此它基本上与
'a'|'c'|'e'
相同。这是因为数组元素键的类型总是
number