Typescript 从rest参数推断条件元组

Typescript 从rest参数推断条件元组,typescript,types,tuples,Typescript,Types,Tuples,是否可以从键/值映射推断元组 基本上,它可以是从联合类型到元组的转换(如下所示) 但我希望有一个更优雅、更友好的解决方案,比如手册中建议的元组函数() 接口参数映射{ a:布尔型; b:弦; c:‘foo’|‘bar’; } 声明函数param(…名称:K[]):ParamMapping[K]; //可行的解决方案: //声明函数param(…名称:K[]):ParamMapping[…K]; //声明函数param(…名称:K[]):…ParamMapping[K]; //声明函数param(

是否可以从键/值映射推断元组

基本上,它可以是从联合类型到元组的转换(如下所示)

但我希望有一个更优雅、更友好的解决方案,比如手册中建议的元组函数()

接口参数映射{
a:布尔型;
b:弦;
c:‘foo’|‘bar’;
}
声明函数param(…名称:K[]):ParamMapping[K];
//可行的解决方案:
//声明函数param(…名称:K[]):ParamMapping[…K];
//声明函数param(…名称:K[]):…ParamMapping[K];
//声明函数param(…名称:K):对于K中的P:ParamMapping[K];
声明函数参数(…名称:字符串[]):未知[];
//键入为未知[]
常数p1=param('baz','qux');
//*应*键入为[布尔值,字符串]
常量p2=参数('a','b');
//*应*键入为[字符串'foo'|'bar']
常量p3=参数('b','c');
//*应*键入为[boolean,string,'foo'|'bar']
常数p4=参数('a','b','c');

我认为您希望通过将第一个重载签名更改为:

declare function param<T extends Array<keyof ParamMapping>>(...name: T): {
    [I in keyof T]: ParamMapping[Extract<T[I], keyof ParamMapping>]
};
好的,希望能有帮助。祝你好运

我认为您希望通过将第一个重载签名更改为:

declare function param<T extends Array<keyof ParamMapping>>(...name: T): {
    [I in keyof T]: ParamMapping[Extract<T[I], keyof ParamMapping>]
};
好的,希望能有帮助。祝你好运

EDIT我的“解决方案”在很多方面都是错的 这里是一个改进的工作示例。有些地方有点不对劲,但它可以做到:

//后一种可扩充的基本接口
接口参数映射{
a:布尔型;
b:弦;
c:‘foo’|‘bar’;
}
//按未知类型处理其他情况
接口ExtendedParamMapping扩展了ParamMapping{
[P:字符串]:未知;
}
//在“foo”|“bar”|字符串上处理自动完成
键入UnknownMapping=string&{{u0?:never}
//对。这样命名。
类型Jcalz={
[I in keyof T]:扩展参数映射[Extract]
};
声明函数param(…名称:U | T):Jcalz;
常数p1=param('baz','qux');
//常数p1:[未知,未知]
常量p2=参数('a','b');
//常量p2:[布尔值,字符串]
常量p3=参数('b','c');
//常量p3:[字符串,“foo”|“bar”]
常数p4=参数('a','b','c');
//常量p4:[布尔值,字符串,“foo”|“bar”]
常数p5=param('a','baz');
//常量p6:[布尔值,未知]
常量p6=参数('foo','c');
//常量p4:[未知,“foo”|“bar”]


原始答案 (作为帖子回答,不要在评论部分使用代码&因为它解决了我的问题)

我想我已经找到了处理自动完成的方法:

接口参数映射{
a:布尔型;
b:弦;
c:‘foo’|‘bar’;
}
键入UnknownMapping=string&{{u0?:never}
//对。这样命名。
类型Jcalz={
[I in keyof T]:参数映射[Extract]
};
类型MappedType=T扩展参数映射的键?Jcalz:未知;
声明函数param(…名称:T | UnknownMapping[]):MappedType;
//声明函数参数(…名称:字符串[]):未知[];//不再需要了
常数p1=param('baz','qux');
//常量p1:未知[]
//“基本”字符串工作!
常量p2=参数('a','b');
//常量p2:[布尔值,字符串]
//自动完成工作!
不需要其他重载,原始接口保持原样,自动完成工作。(灵感来源于此)

我会确定我被接受。

EDIT我的“解决方案”在很多方面都是错的 这里是一个改进的工作示例。有些地方有点不对劲,但它可以做到:

//后一种可扩充的基本接口
接口参数映射{
a:布尔型;
b:弦;
c:‘foo’|‘bar’;
}
//按未知类型处理其他情况
接口ExtendedParamMapping扩展了ParamMapping{
[P:字符串]:未知;
}
//在“foo”|“bar”|字符串上处理自动完成
键入UnknownMapping=string&{{u0?:never}
//对。这样命名。
类型Jcalz={
[I in keyof T]:扩展参数映射[Extract]
};
声明函数param(…名称:U | T):Jcalz;
常数p1=param('baz','qux');
//常数p1:[未知,未知]
常量p2=参数('a','b');
//常量p2:[布尔值,字符串]
常量p3=参数('b','c');
//常量p3:[字符串,“foo”|“bar”]
常数p4=参数('a','b','c');
//常量p4:[布尔值,字符串,“foo”|“bar”]
常数p5=param('a','baz');
//常量p6:[布尔值,未知]
常量p6=参数('foo','c');
//常量p4:[未知,“foo”|“bar”]


原始答案 (作为帖子回答,不要在评论部分使用代码&因为它解决了我的问题)

我想我已经找到了处理自动完成的方法:

接口参数映射{
a:布尔型;
b:弦;
c:‘foo’|‘bar’;
}
键入UnknownMapping=string&{{u0?:never}
//对。这样命名。
类型Jcalz={
[I in keyof T]:参数映射[Extract]
};
类型MappedType=T扩展参数映射的键?Jcalz:未知;
声明函数param(…名称:T | UnknownMapping[]):MappedType;
//声明函数参数(…名称:字符串[]):未知[];//不再需要了
常数p1=param('baz','qux');
//常量p1:未知[]
//“基本”字符串工作!
常量p2=参数('a','b');
//常量p2:[布尔值,字符串]
//自动完成工作!
不需要其他重载,原始接口保持原样,自动完成工作。(灵感来源于此)


我将确认您已接受。

您好,首先感谢您的回答。这解决了一半的问题,因为您从
param
函数中删除了autocomplete。这就是我想要重载的内容,而不是将
keyof ParamMapping | string
作为
param
args类型。有什么想法吗?嗯,但是你的问题中没有提到自动完成,你的原始版本也没有自动完成功能,据我所知,这解决了整个问题。当您有重载时,当您键入
param(“
时,您的IDE可能会选择
字符串[]
重载,因为该字符串将