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