Typescript-输出类型取决于输入类型

Typescript-输出类型取决于输入类型,typescript,typescript-typings,Typescript,Typescript Typings,我有一个检查输入字段有效性的函数 export const getInputValidity = (inputData:DeepReadonly<InputData> , val:string) => { const {length} = val if (inputData.type==="select"){ return val.length<5 } if (inputData.type==="email"){

我有一个检查输入字段有效性的函数

export const getInputValidity = (inputData:DeepReadonly<InputData> , val:string) => {
    const {length} = val
    if (inputData.type==="select"){
        return val.length<5
    } 
    if (inputData.type==="email"){
        return {
            validEdit: !length || isExp(val, /^[a-zA-Z0-9!#$%&'*+-/=?^_`{|}~."(),:;<>@[\]]+$/), 
            validFinal: length && isExp(val, COMMON_REGEX.email)
        } 
    }
}
因此,如果
EMAIL\u INPUT\u DATA.type==“EMAIL”
我希望有效性的类型是

{
   validEdit: boolean
   validFinal: boolean
}
可能吗?当前有效性键入为

const validity: true | {
    readonly validEdit: boolean;
    readonly validFinal: boolean | 0;
    readonly validLength?: undefined;
    readonly validChars?: undefined;
} | {
    readonly validLength: boolean;
    readonly validChars: boolean;
    readonly validEdit?: undefined;
    readonly validFinal?: undefined;
}
我知道这可以通过键入getInputValidity作为函数来实现,但它可以从实现中推断出来吗?

您可以使用以下方法来实现:

const isExp=(s:String,r:RegExp)=>true;
接口IValidityReturn{
validIt:布尔型;
validFinal:布尔值;
}
函数getInputValidity(inputData:{type:'select'},val:string):布尔值;
函数getInputValidity(inputData:{type:'select'},val:string):布尔值;
函数getInputValidity(inputData:{type:'select'|'email'},val:string):布尔值| IValidityReturn{
常数{length}=val
如果(inputData.type==“选择”){
return val.length可用于执行此操作:

const isExp=(s:String,r:RegExp)=>true;
接口IValidityReturn{
validIt:布尔型;
validFinal:布尔值;
}
函数getInputValidity(inputData:{type:'select'},val:string):布尔值;
函数getInputValidity(inputData:{type:'select'},val:string):布尔值;
函数getInputValidity(inputData:{type:'select'|'email'},val:string):布尔值| IValidityReturn{
常数{length}=val
如果(inputData.type==“选择”){

return val.length只是想澄清一下,你是说当用不同的参数调用函数时,你想返回不同类型的对象吗?@OliverRadini,“type”字段在这里可能会混淆,但我不想更改函数的功能,只想更改类型。当我们用“select”传递inputData时作为类型字段,我们知道返回类型将是布尔类型,当我们将“email”作为类型字段传递时,我们知道返回类型将是{validIt:boolean,validFinal:boolean},但是编译器不认识到这一点。啊,好的,我认为这是有意义的-您正在尝试返回
{validIt:boolean;validFinal:boolean;
当输入类型为
“email”
,如果输入类型为
“boolean>”,请选择“
”?@OliverRadini,更正只是为了澄清一下,您是说当使用不同参数调用函数时,您希望返回不同类型的对象吗?@OliverRadini,“type”字段在这里可能会混淆,但我不想更改函数的功能,只想更改类型。当我们将“select”作为类型字段传递inputData时,我们知道返回类型将是布尔类型,而当我们将“email”作为类型字段传递时,我们知道返回类型将是布尔类型{validEdit:boolean,validFinal:boolean}但是编译器没有识别出来。啊,好吧,我认为这是有意义的-当输入类型为
“email”
时,您试图返回
{validEdit:boolean;validFinal:boolean;
,如果输入类型为
,则选择
?@OliverRadini,谢谢!但是,正如我提到的“我知道这可以通过键入getInputValidity作为函数来完成,但是它可以从实现中推断出来吗?”我知道可以用这种方式解决。我不确定Typescript为什么不能从实现中识别返回类型,如果可能的话。还有其他类型(除了“选择”和“电子邮件”)如果我需要为每种情况准备一个重载,我宁愿选择不同的方向。@bencarp typescript能够从实现中推断出一些细节,但不是全部细节,但这些细节主要围绕类型保护。您的代码使这种类型推断看起来相对简单,但实际上非常复杂。Y您要求typescript能够基本上运行代码,并使用它对生成的类型进行假设,这很快就会变得非常困难!谢谢!但是,正如我所提到的,“我知道这可以通过键入getInputValidity作为函数来完成,但是可以从实现中推断出来吗?”我知道可以用这种方式解决。我不确定Typescript为什么不能从实现中识别返回类型,如果可能的话。还有其他类型(除了“选择”和“电子邮件”)如果我需要为每种情况准备一个重载,我宁愿选择不同的方向。@bencarp typescript能够从实现中推断出一些细节,但不是全部细节,但这些细节主要围绕类型保护。您的代码使这种类型推断看起来相对简单,但实际上非常复杂。Y您要求typescript能够基本上运行代码,并使用它对生成的类型进行假设,这很快就会变得非常困难
const validity: true | {
    readonly validEdit: boolean;
    readonly validFinal: boolean | 0;
    readonly validLength?: undefined;
    readonly validChars?: undefined;
} | {
    readonly validLength: boolean;
    readonly validChars: boolean;
    readonly validEdit?: undefined;
    readonly validFinal?: undefined;
}