Typescript 类型脚本依赖于其他元组成员的元组成员类型

Typescript 类型脚本依赖于其他元组成员的元组成员类型,typescript,Typescript,我想创建一个函数,它接受多对对象和这些对象的键,并让编译器强制执行。我目前写了以下内容: declare function foo(...params: [any, string][]): void; 这让我可以写一些像 foo([a, "propOfA"], [b, "propOfB"]); 然而,它也允许我写作 foo([a, "propofB"], [b, "propOfA"]); 这是有意义的,因为第二个值的类型只是string。我可以使用keyof将每个元组的第二个值限制为同一元

我想创建一个函数,它接受多对对象和这些对象的键,并让编译器强制执行。我目前写了以下内容:

declare function foo(...params: [any, string][]): void;
这让我可以写一些像

foo([a, "propOfA"], [b, "propOfB"]);
然而,它也允许我写作

foo([a, "propofB"], [b, "propOfA"]);

这是有意义的,因为第二个值的类型只是
string
。我可以使用
keyof
将每个元组的第二个值限制为同一元组的第一个值的键吗?

可以使用泛型执行此操作:

声明函数foo(…参数:[T,keyof T][]):void

现在,类型T将从传入的参数的第一个数组元素推断出来

const a = { a: 1 }
const b = { b: 2 }

// not allowed
foo([a, 'b']);
foo([b, 'a']);

// okay
foo([a, 'a']);
foo([b, 'b']);

请注意,如果使用多个参数,例如
foo([a,'a'],[b,'b'])
a
b
必须是相同类型(或兼容类型)。

如果只有一个参数,@ExplosionPills中的代码有效。如果希望支持多个元组值参数,每个元组值参数都会将第二个元素约束为第一个元素的键,可以这样做:

declare function foo<A extends any[]>(
  ...params: { [I in keyof A]: [A[I], keyof A[I]] }
): void;
我觉得不错。希望有帮助;祝你好运


@PatrickRoberts您可以使用映射元组的推理使用单个泛型函数来完成此操作,如果您愿意,可以将其用于任意数量的独立参数;看,这是一个很好的解决方案,谢谢你让我了解这个结构。
const a = { a: 1 };
const b = { b: 2 };

// not allowed
foo([a, "b"]);
foo([b, "a"]);
foo([a, "a"], [b, "a"])

// okay
foo([a, "a"]);
foo([b, "b"]);
foo([a, "a"], [b, "b"]);