Typescript 使接口接受动态对象生成器函数的返回

Typescript 使接口接受动态对象生成器函数的返回,typescript,Typescript,假设我的代码中有以下接口: 接口IOptionLabel{ 标签:字符串 值:T } 接口IOptionText{ 文本:字符串 值:T } 然后我使用以下函数创建IOptionLabel或IOptionText(或者实际上,我可能拥有的任何IOption)的数组: const generateOptions=(值:T[],键='label')=>{ 返回值.map(值=>({ [key]:`Option${value}`, 价值 })) } 但是,当我尝试使用此函数生成数组时,typesc

假设我的代码中有以下接口:

接口IOptionLabel{
标签:字符串
值:T
}
接口IOptionText{
文本:字符串
值:T
}
然后我使用以下函数创建
IOptionLabel
IOptionText
(或者实际上,我可能拥有的任何
IOption
)的数组:

const generateOptions=(值:T[],键='label')=>{
返回值.map(值=>({
[key]:`Option${value}`,
价值
}))
}
但是,当我尝试使用此函数生成数组时,typescript对此表示不满:

const labeloptions:IOptionLabel[]=generateOptions([1,2,3])
常量文本选项s:IOptionText[]=生成选项([1,2,3],'text')
我得到以下错误:

类型“{[x:string]:string | number;value:number;}[]”不能分配给类型“IOptionLabel[]”。属性“label”在类型“{[x:string]:string | number;value:number;}”中丢失,但在类型“IOptionLabel”中是必需的

类型“{[x:string]:string | number;value:number;}[]”不能分配给类型“IOptionText[]”。属性“text”在类型“{[x:string]:string | number;value:number;}”中丢失,但在类型“IOptionText”中是必需的


我知道发生这些错误是因为我的
[key]
实际上只是在运行时设置的,typescript无法确保它们是正确的。至少是我提供的类型

但我并没有放弃尝试,因为我知道有一种方法可以让typescript在这种情况下正确地键入我的返回

经过一番周折,我想出了以下可行的解决方案:

接口IOptionLabel{
标签:字符串
值:T
}
接口IOptionText{
文本:字符串
值:T
}
//非显式错误
//类型generateOptions返回={[key in L]:string}&{value:T}
//函数generateOptions(值:T[]):generateOptions返回[]
//函数generateOptions(值:T[],键:K):generateOptions返回[]
//更明确的错误
函数生成选项(值:T[]):({[key in'label']:string}&{value:T})[]
函数生成选项(值:T[],键:K):({[K:key]:string}&{value:T})[]
函数生成选项(值:T[],键='label'){
返回值.map(值=>({
[key]:`Option${value}`,
价值
}))
}
//这些应该有效
常量标签选项:IOptionLabel[]=生成选项([1,2,3])
常量文本选项s:IOptionText[]=生成选项([1,2,3],'text')
//这些应该失败
常量标签选项F:IOptionLabel[]=生成选项([1,2,3],“文本”)
const-textOptionsF:IOptionText[]=生成选项([1,2,3])
您可以将其粘贴到Typescript中并检查实现



但最后的问题是:有没有更简单(或更正确)的方法来实现这一点?

我觉得这很好。。。在编译器无法验证您正在执行的操作的情况下,具有泛型调用签名的重载函数(其实现足够松散以防止编译器错误)是一种非常有效的方法。如果它对你有用,那就保留它。