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]>;