[英]Restrict typescript class methods implementing interface
目前,如果我创建一个实现接口的类,则创建的类将所有未包含在接口中的方法。 这是一个例子:
interface ExampleTypes {
alpha();
}
class Example implements ExampleTypes {
alpha () {
return true
}
beta () {
return true
}
}
我正在寻找一种方法来限制给定类可以拥有的方法。
这也是我尝试过的:
class ExampleSource {
alpha () {
return true
}
}
class Example implements Partial<ExampleSource> {
alpha () {
return true
}
beta () {
return true
}
}
和这个:
class ExampleSource {
alpha () {
return true
}
}
class Example implements ExampleSource {
alpha () {
return true
}
beta () {
return true
}
}
这是不直观的。 我希望在Example
中不允许使用beta
。
这是有效但使用函数而不是类的功能:
interface ExampleType {
alpha?();
beta?();
}
这是价值:
function Example(): ExampleType {
return {
alpha: () => true,
};
}
这会引发打字稿错误:
function Example(): ExampleType {
return {
alpha: () => true,
meow: () => true,
};
}
理想情况下,我可以拥有相同的功能,但需要使用类。
这是一个奇怪的要求,因为拥有额外的方法不会阻止您使用该类,就好像它们不存在一样。 TypeScript 并没有真正支持从类型中排除额外的属性或方法。 也就是说,目前没有对microsoft/TypeScript#12936中要求的确切类型的直接支持。
幸运的是,您可以通过创建一个自引用的条件映射类型来获得这种行为:
type Exactly<T, U> = { [K in keyof U]: K extends keyof T ? T[K] : never };
如果你声明一个类型U
是Exactly<T, U>
,它将确保U
匹配T
,并且任何额外的属性都是never
类型。 自引用/递归/循环类型并不总是编译,但在这种情况下,您只在 U 的定义中引用keyof U
U
这是允许的。
让我们尝试一下:
interface ExampleTypes {
alpha(): boolean; // adding return type
}
// notice the self-reference here
class Example implements Exactly<ExampleTypes, Example> {
// okay
alpha() {
return true;
}
// error! Type '() => boolean' is not assignable to type 'never'.
beta() {
return true;
}
}
看起来它有效!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.