具有通用方法的Typescript接口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有通用方法的Typescript接口相关的知识,希望对你有一定的参考价值。

是否有可能在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')
答案

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接口上设置泛型限制,从而使您获得更多控制权。您的界面应定义合同,而不是实现合同的类。

以上是关于具有通用方法的Typescript接口的主要内容,如果未能解决你的问题,请参考以下文章

映射具有未知深度的通用 TypeScript 接口

Typescript - 具有通用类型函数的索引签名

实现具有类型约束的通用接口

Typescript 接口通用属性名称

Typescript 扩展通用接口

在 TypeScript 中扩展参数化接口的通用接口