Typescript 将类型转换为类型的元组的实用程序类型
我希望跟踪某个值的更改,并同步与以前值的差异。所以我想保留旧值,当新值出现时,我想返回新值和旧值Typescript 将类型转换为类型的元组的实用程序类型,typescript,Typescript,我希望跟踪某个值的更改,并同步与以前值的差异。所以我想保留旧值,当新值出现时,我想返回新值和旧值 type VUpdateLike = string | number | 3 class VUpdateHistory<A extends VUpdateLike> { oldUpdate: A constructor(oldUpdate: A) { this.oldUpdate = oldUpdate; } add(update: A): [A, A] {
type VUpdateLike = string | number | 3
class VUpdateHistory<A extends VUpdateLike> {
oldUpdate: A
constructor(oldUpdate: A) {
this.oldUpdate = oldUpdate;
}
add(update: A): [A, A] {
let oldUpdate = this.oldUpdate;
this.oldUpdate = update;
return [update, oldUpdate];
}
}
const hist = new VUpdateHistory<VUpdateLike>(10);
let apair = hist.add(3);
console.log(apair[0] + apair[1]);
const hist2 = new VUpdateHistory<VUpdateLike>('10');
let pair2 = hist.add('3');
console.log(apair[0] + apair[1]);
如何在不重复该类型的情况下执行此操作,例如:
export type VUpdateLike = [number, number] |
[string, string] |
[3, 3]
export type VUpdateLike = Tuple<number | string | 3>
export type VUpdateLike = Tuple<string | "test">
导出类型VUpdateLike=Tuple
您可以通过以下方式完成此操作:
此解决方案利用。您可以通过以下方式实现:
此解决方案利用了。您能为
K扩展任何
魔法添加解释吗?为什么它不允许将[number,string]赋值给变量?我已经更新了解释它的答案。如果解释不够清楚,请告诉我,我会尽量给出更好的描述。在我链接的文档中也有更详细的解释。我编辑了我的问题以更好地解释我的问题,谢谢。您可能希望链接到。此外,如果OP对不重复它们的类型感兴趣,您认为string |“test”
从一开始就注定失败是对的,但您可能建议[string]|[“test”]
或类似的方法。我想用我自己的答案来回答这个问题,但是这里已经写了基本原理,所以只有当你不想用这些信息来修改这个答案时,我才会这么做。@jcalz,我已经修复了一个错误,不小心将操场链接了两次而不是docu,并添加了你的答案。你能为K扩展了任何魔法添加一个解释吗?为什么它不允许将[number,string]赋值给变量?我已经更新了解释它的答案。如果解释不够清楚,请告诉我,我会尽量给出更好的描述。在我链接的文档中也有更详细的解释。我编辑了我的问题以更好地解释我的问题,谢谢。您可能希望链接到。此外,如果OP对不重复它们的类型感兴趣,您认为string |“test”
从一开始就注定失败是对的,但您可能建议[string]|[“test”]
或类似的方法。我想用我自己的答案来回答这个问题,但是基本原理已经写在这里了,所以只有当你不想用这些信息修改这个答案时,我才会这么做。@jcalz,我已经修复了一个错误,不小心链接了操场两次而不是docu并添加了你的答案。为什么你只返回最后一个旧值?更新历史记录是否更适合于为您所做的每项更改创建一个新的VUpdate历史记录,或者跟踪对象内部的所有更改(例如,以前的值数组)?我这样问是因为您当前的示例不适用于类型,因为如果不使用函数或新对象对泛型“A”进行包装,就无法追溯更改其值。为什么只返回最后一个旧值?更新历史记录是否更适合于为您所做的每项更改创建一个新的VUpdate历史记录,或者跟踪对象内部的所有更改(例如,以前的值数组)?我这样问是因为您当前的示例不适用于类型,因为如果不使用函数或新对象对泛型“A”进行包装,就无法追溯更改其值。
export type VUpdateLike = Tuple<string | "test">
type Pair<T> = T extends [infer U] ? [U, U] : never
export type VUpdateLike = Pair<[string] | [number] | ["hello"] | [123]>;