打字稿扩展通用接口

时间:2020-02-25 15:22:39

标签: typescript inheritance typescript-generics

我想创建一个接口,通过该接口我可以扩展任何打字稿类型以添加​​用于扩展通用类型的属性。例如,创建一个看起来像这样的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
}

尽管我觉得自己在欺骗我,但似乎能完成我想做的事情。

我认识到如果我覆盖通用类型的属性,那么这个“反向扩展名”可能是有问题的,但这是唯一需要关注的吗?我无法解决这个问题,创建仅添加属性的类型的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

有一个长期的功能请求microsoft/TypeScript#2225,它要求您能够按照自己的方式进行@Service(value = "concertService") public class ConcertServiceImpl implements ConcertService { public Page<Concert> findAll(@Nullable Specification<Concert> spec, Pageable pageable){ List<Concert> list = new ArrayList<>(); concertDao.findAll(spec).iterator().forEachRemaining(list::add); return new PageImpl<Concert>(list); } } 。它尚未实现(可能永远不会实现)。现在,您只能使用静态已知键创建一个interface Foo<T> extends T {...}对象类型的接口。未指定的通用类型参数extends不起作用,因为编译器无法预测它将拥有哪些键。

您应该放心,intersection是实现这一目标的合理方法(请注意,如您所注意到的,如果您添加的属性与T的属性冲突,则不会警告您) 。它是上述功能请求中的suggested解决方案。另外,TypeScript library typingsObject.assign()使用交集来表示将属性添加到现有对象的结果的类型。因此,将T定义为

Confidence<T>

您可以轻松地编写一个生成如下所示函数的函数:

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

并使用它:

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

看起来不错。好吧,希望能有所帮助;祝你好运!

Playground link to code

答案 1 :(得分:-1)

您的最后一个代码段是正确的方法。