您好,打字稿专业人员。我不需要解决方案,但有提示,如果可以在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
答案 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等,...)的数量增加到更多有用的类型(例如,头,尾巴,尾巴等),
还要提及这些好的文章,这些文章帮助我了解了如何构建自己的复杂类型:
注意:我还发现,要构建的这些复杂类型的核心实际上只是extends
,type
和infer
!>