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)
如果声明类型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;
}
}
Run Code Online (Sandbox Code Playgroud)
看起来很有效.希望有所帮助.祝好运!
归档时间: |
|
查看次数: |
424 次 |
最近记录: |