8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Typescript 扩展通用接口

TheNightwalker 1月前

27 0

我想创建一个接口,通过该接口我可以扩展任何 TypeScript 类型以添加​​属性来扩展泛型类型。例如,创建一个 Confidence类型看起来像这样:export int ...

我想创建一个接口,通过该接口我可以扩展任何 TypeScript 类型以添加​​属性来扩展泛型类型。例如,创建一个 Confidence<any> 如下所示的类型:

export interface Confidence<T> extends T{
   confidenceLevel:number
}

然后可以通过以下方式访问:

const date:Confidence<Date> = new Date();
date.confidenceLevel = .9;

这似乎是不可能的(我觉得这是反模式的),但我可以做到

export type Confidence<T> = T & {
   confidenceLevel:number
}

尽管我觉得这样做像是在作弊,但这似乎完成了我想要做的事情。

我意识到,如果我覆盖通用类型的属性,这种“反向扩展”可能会有问题,但这是唯一值得担心的问题吗?我很难理解这一点,创建仅添加属性的类型的最佳方法是什么?

帖子版权声明 1、本帖标题:Typescript 扩展通用接口
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由TheNightwalker在本站《typescript》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 有一个长期存在的功能请求, microsoft/TypeScript#2225 ,它要求能够 interface Foo<T> extends T {...} 按照您要求的方式执行。它尚未实现(并且可能永远不会实现)。现在,您只能创建一个 extends 静态已知键 对象类型 。未指定的泛型类型参数 T 不起作用,因为编译器无法预测它将具有哪些键。

    请注意,您无法通过尝试 constrain 类型参数(如) interface Foo<T extends {}> extends T {....} 。 这只会给您一个关于约束的误导性错误消息,如 microsoft/TypeScript#57037 没有静态已知键的 T 相同问题 T extends U 没有将的键限制 T 为的键 U ;它可能具有更多属性)。


    您应该放心, intersection 是实现此目的的合理方法(但需要注意的是,如果您添加的属性与 的属性冲突,您不会收到警告, T 正如您所注意到的)。这是 上述功能请求中 建议的 TypeScript 库 Object.assign() 类型使用交集来表示向现有对象添加属性的结果类型。因此, Confidence<T> 定义如下

    type Confidence<T> = T & {
      confidenceLevel: number
    }
    

    您可以轻松编写一个函数来生成其中一个,如下所示:

    function makeConfidence<T>(x: T, confidenceLevel: number): Confidence<T> {
      return Object.assign(x, { confidenceLevel });
    }
    

    并使用它:

    const x = makeConfidence(new Date(), 0.9); // x is a Confidence<Date>;
    console.log(x.getFullYear()); // 2020
    console.log(x.confidenceLevel); 0.9
    

    看起来不错。

    游乐场链接到代码

  • 感谢您的健全性检查以及关于这是请求功能的说明!我想我对界面和类型有点困惑,但我想我会把它留到另一天再说。

  • 如果 T 是可选类型,比如 Confidence 类型= T & {...}, 这将返回未定义而不是其余的{...},知道如何解决这个问题吗?

  • jcalz :

    如果要使泛型类型成为 T 可选类型,可以将其扩展 Record<string, unknown> 并将值设置为 Record<string, unknown> .

    type Confidence<
      T extends Record<string, unknown> = Record<string, unknown>
    > = T & {
      confidenceLevel: number
    };
    

    然后,您将能够在需要时不使用任何泛型来使用它:

    interface Bar {
      barLevel: number
    };
    
    const foo: Confidence = { confidenceLevel: 100 };
    const bar: Confidence<Bar> = { confidenceLevel: 100, barLevel: 2 };
    
返回
作者最近主题: