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

时间:2019-07-31 09:58:52

标签: typescript typescript-typings typescript-generics conditional-types

您好,打字稿专业人员。我不需要解决方案,但有提示,如果可以在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']> {

}

打字稿版本:3.4.5

3 个答案:

答案 0 :(得分:3)

为此,您不需要条件类型,内置映射类型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'> {

}

答案 1 :(得分:3)

如果我正确地理解了您的意图,则可以执行以下操作:

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']> {

}

请注意,如果不需要将成员声明为数组,则最好使用Titian Dragomir的解决方案。

答案 2 :(得分:0)

更新:我发现这两个很棒的输入库使typescript的内置类型(Pick,Exclude,Extract,Merge等,...)的数量增加到更多有用的类型(例如,头,尾巴,尾巴等),

还要提及这些好的文章,这些文章帮助我了解了如何构建自己的复杂类型:

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