[英]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.