繁体   English   中英

限制 typescript 类方法实现接口

[英]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 };

如果你声明一个类型UExactly<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM