限制实现接口的typescript类方法

Tho*_*ggi 1 javascript class typescript

目前,如果我创建一个实现接口的类,则创建的类将不包含在接口中的所有方法.这是一个例子:

interface ExampleTypes {
  alpha();
}

class Example implements ExampleTypes {
  alpha () {
    return true
  }
  beta () {
    return true
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种限制给定类可以拥有的方法的方法.

这也是我也尝试过的:

class ExampleSource {
  alpha () {
    return true
  }
}

class Example implements Partial<ExampleSource> {
  alpha () {
    return true
  }
  beta () {
    return true
  }
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

class ExampleSource {
  alpha () {
    return true
  }
}

class Example implements ExampleSource {
  alpha () {
    return true
  }
  beta () {
    return true
  }
}
Run Code Online (Sandbox Code Playgroud)

这是不直观的.我不想beta被允许进入Example.

这是功能但使用函数而不是类:

interface ExampleType {
  alpha?();
  beta?();
}
Run Code Online (Sandbox Code Playgroud)

这是价值:

function Example(): ExampleType {
  return {
    alpha: () => true,
  };
}
Run Code Online (Sandbox Code Playgroud)

这会引发一个打字稿错误:

function Example(): ExampleType {
  return {
    alpha: () => true,
    meow: () => true,
  };
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我可以使用相同的功能,但使用类.

jca*_*alz 11

这是一个奇怪的请求,因为有额外的方法不会阻止你使用该类,就好像它们不存在一样.TypeScript实际上并没有很多支持从类型中排除额外的属性或方法; 也就是说,目前没有对确切类型的直接支持.

幸运的是,你可以排序的通过得到这种行为使一个自我指涉的条件,映射类型:

type Exactly<T, U> = { [K in keyof U]: K extends keyof T ? T[K] : never };
Run Code Online (Sandbox Code Playgroud)

如果声明类型UExactly<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;
  }
}
Run Code Online (Sandbox Code Playgroud)

看起来很有效.希望有所帮助.祝好运!

  • 这就是"完全"我想要的东西,非常感谢你! (4认同)