我想创建一个接口,通过该接口我可以扩展任何打字稿类型以添加用于扩展通用类型的属性。例如,创建一个看起来像这样的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
}
尽管我觉得自己在欺骗我,但似乎能完成我想做的事情。
我认识到如果我覆盖通用类型的属性,那么这个“反向扩展名”可能是有问题的,但这是唯一需要关注的吗?我无法解决这个问题,创建仅添加属性的类型的最佳方法是什么?
答案 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 typings的Object.assign()
使用交集来表示将属性添加到现有对象的结果的类型。因此,将T
定义为
Confidence<T>
您可以轻松地编写一个生成如下所示函数的函数:
type Confidence<T> = T & {
confidenceLevel: number
}
并使用它:
function makeConfidence<T>(x: T, confidenceLevel: number): Confidence<T> {
return Object.assign(x, { confidenceLevel });
}
看起来不错。好吧,希望能有所帮助;祝你好运!
答案 1 :(得分:-1)
您的最后一个代码段是正确的方法。