【发布时间】:2020-03-24 02:28:30
【问题描述】:
是否可以在 Typescript 中使用泛型方法的接口,让我们知道 T 类型将扩展其他类型?
interface Abc {
a: string;
b: string;
c: string;
}
interface Checkout {
onComplete<T>(session: T): void
}
class StripeCheckout implements Checkout {
onComplete<T extends Abc>(abc: T) {
console.log(abc.a);
}
}
onComplete 方法无效
Property 'onComplete' in type 'StripeCheckout' is not assignable to the same property in base type 'Checkout'.
Type '<T extends Abc>(session: T) => void' is not assignable to type '<T>(session: T) => void'.
Types of parameters 'session' and 'session' are incompatible.
Type 'T' is not assignable to type 'Abc'.(2416)
解决方案#1(通用接口将迫使我们在类级别告诉类型):
interface Abc {
a: string;
b: string;
c: string;
}
interface Checkout<T> {
onComplete(session: T): void
}
class StripeCheckout implements Checkout<Abc> {
onComplete(session: Abc) {
console.log(session);
}
}
问题是,如果我将有更多具有不同类型的通用方法,它将看起来像这样Abc<T, U, V, Z>。我们可以通过多个接口来解决这个问题,但是当我在类中定义方法时,我想告诉 Typescript 泛型方法类型。
解决方案 #2(任何“通用”):
interface Abc {
a: string;
b: string;
c: string;
}
interface Checkout {
onComplete(session: any): void
}
class StripeCheckout implements Checkout {
onComplete(session: Abc) {
console.log(session);
}
}
示例用法:
const checkout = new StripeCheckout();
checkout.onComplete({a: '1', b: '2', c: '3'})
【问题讨论】:
-
Checkout<A, B, C, D>有什么问题,其中 A、B、C、D 是扩展方法的参数? -
您应该在接口级别定义约束,否则您将违反替换原则
标签: typescript