【问题标题】:Typescript interface with generic methods带有泛型方法的 Typescript 接口
【发布时间】: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&lt;T, U, V, Z&gt;。我们可以通过多个接口来解决这个问题,但是当我在类中定义方法时,我想告诉 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&lt;A, B, C, D&gt; 有什么问题,其中 A、B、C、D 是扩展方法的参数?
  • 您应该在接口级别定义约束,否则您将违反替换原则

标签: typescript


【解决方案1】:

TypeScript 和许多其他语言不允许你这样做,我建议第一个解决方案。

interface Abc {
    a: string;
    b: string;
    c: string;
}
interface Default {
    a: number;
}
interface Checkout<T, A=Default> {
    onComplete(session: T): void;
    otherFunction(input: A) : void;
}
class StripeCheckout implements Checkout<Abc> {
    otherFunction(input: Default) {
        throw new Error("Method not implemented.");
    }
    onComplete(session: Abc) {
        console.log(session);
    }
}

为什么?因为这样你可以在Checkout 接口上设置泛型的限制,给你更多的控制权。你的接口应该定义契约,而不是实现它的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2017-07-22
    • 2011-03-14
    • 2012-03-01
    • 2017-11-13
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多