使TypeScript返回类型取决于是否存在可选属性

使TypeScript返回类型取决于是否存在可选属性,typescript,typescript-generics,typeguards,Typescript,Typescript Generics,Typeguards,我有一个函数如下所示: function foo(a) { if(a.optionalProperty === undefined) { return { one: 1, two: 2 } } else { return { one: 1, two: 2, optionalResultProperty: "

我有一个函数如下所示:

function foo(a) {
    if(a.optionalProperty === undefined) {
        return {
            one: 1,
            two: 2
        }
    } else {
        return {
            one: 1,
            two: 2,
            optionalResultProperty: "some stuff"
        }
    }
}
参数a是以下两种类型之一:

SomeType & {
    optionalProperty: string
}

// or

SomeType
我想指定返回类型,使其与函数定义相匹配,这意味着当存在
optionalProperty
时,返回类型应该是特定的返回类型,如果不存在,则应该是不同的返回类型

这就是我迄今为止所尝试的:

function foo<x extends (SomeType & { optionalProperty: string }) | SomeType>(a: x): x extends (SomeType & { optionalProperty: string }) ? SomeReturnType : Omit<SomeReturnType, "optionalResultProperty"> {
    // ..
}
函数foo(a:x):x扩展(SomeType&{optionalProperty:string})?SomeReturnType:省略{ // .. } 然而,这似乎并不正确。它表示代码不能分配给类型


做这件事的正确方法是什么?

您在这里似乎想要的是。这应该以更具可读性的方式完成这项工作

typesometype={p:string};
键入RetOne={one:number;two:number};
键入RetTwo=RetOne&{optionalResultProperty:string};
函数foo(a:SomeType):RetOne;
函数foo(a:SomeType&{optionalProperty:string}):RetTwo;
函数foo(a:SomeType | SomeType&{optionalProperty:string}){
if(a中的“optionalProperty”){
返回{
一:一,,
二:二,,
optionalResultProperty:“一些东西”,
};
}否则{
返回{
一:一,,
二:二,,
};
}
}
//返回类型:RetOne
const ret1=foo({p:'some'});
//返回类型:RetTwo
const ret2=foo({p:'some',optionalProperty:'1'});
链接到TypeScript: