簡體   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