代码之家  ›  专栏  ›  技术社区  ›  ThomasReggi

限制类型脚本类方法实现接口

  •  0
  • ThomasReggi  · 技术社区  · 7 年前

    当前,如果我创建一个实现接口的类,那么创建的类将包含接口中不包含的所有方法。下面是一个例子:

    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
      }
    }
    

    这不是必然的。我想 beta 不允许进入 Example .

    这是一个可以工作但使用函数而不是类的功能:

    interface ExampleType {
      alpha?();
      beta?();
    }
    

    这就是价值:

    function Example(): ExampleType {
      return {
        alpha: () => true,
      };
    }
    

    这将引发typescript错误:

    function Example(): ExampleType {
      return {
        alpha: () => true,
        meow: () => true,
      };
    }
    

    理想情况下,我可以拥有相同的功能,但是可以使用类。

    1 回复  |  直到 7 年前
        1
  •  8
  •   jcalz    7 年前

    这是一个奇怪的请求,因为拥有额外的方法不会阻止您像不在类中一样使用类。typescript实际上不支持从类型中排除额外的属性或方法;也就是说,目前没有直接支持 exact types .

    幸运的是,你可以通过 making 自我参照 conditional ,请 mapped 类型:

    type Exactly<T, U> = { [K in keyof U]: K extends keyof T ? T[K] : never };
    

    如果您声明一个类型 U Exactly<T, U> ,它将确保 U 比赛 T ,并且任何额外属性的类型为 never .自引用/递归/循环类型并不总是编译,但在本例中,您只引用 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;
      }
    }
    

    看起来很管用。希望有帮助。祝你好运!

    推荐文章