具有通用方法的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接口的主要内容,如果未能解决你的问题,请参考以下文章