TypeScript条件类型和类型保护

TypeScript条件类型和类型保护,typescript,types,conditional,Typescript,Types,Conditional,我在组合TypeScript的类型保护和条件类型时遇到了一些问题。考虑: export interface IThisThing { someProp: number; } export function isIThisThing(type: any): type is IThisThing { return !!type.someProp; } export interface IThatThing { someOtherProp: string; } expo

我在组合TypeScript的类型保护和条件类型时遇到了一些问题。考虑:

export interface IThisThing {
    someProp: number;
}

export function isIThisThing(type: any): type is IThisThing { 
    return !!type.someProp;
}

export interface IThatThing {
    someOtherProp: string;
}

export function isIThatThing(type: any): type is IThatThing { 
    return !!type.someOtherProp;
}

function doAThing<T extends IThisThing | IThatThing>(
    data: T
): T extends IThisThing ? IThisThing : IThatThing {
    if (isIThisThing(data)) { 
        return data; // Type 'T & IThisThing' is not assignable to type 'T extends IThisThing ? IThisThing : IThatThing'.
    };
    return data; // Type 'T' is not assignable to type 'T extends IThisThing ? IThisThing : IThatThing'.
                 //   Type 'IThisThing | IThatThing' is not assignable to type 'T extends IThisThing ? IThisThing : IThatThing'.
                 //     Type 'IThisThing' is not assignable to type 'T extends IThisThing ? IThisThing : IThatThing'.
}
导出接口i测试{
someProp:数字;
}
导出函数是thisthing(类型:any):类型是thisthing{
return!!键入.someProp;
}
导出接口IThatThing{
其他一些道具:字符串;
}
导出函数为thing(类型:any):类型为IThatThing{
return!!键入.someOtherProp;
}
函数doAThing(
数据:T
):T是什么?IThatThing:IThatThing{
如果(isithishing(data)){
返回数据;//类型“T&IThisThing”不可分配给类型“T扩展IThisThing?IThisThing:IThatThing”。
};
返回数据;//类型“T”不可分配给类型“T扩展了IThisThing?IThisThing:IThatThing”。
//类型“ItiSthing | ItAtthing”不可分配给类型“T扩展ItiSthing?ItiSthing:ItAtthing”。
//类型“IThisThing”不可分配给类型“T扩展IThisThing?IThisThing:IThatThing”。
}
我希望
doAThing
函数接受
IThisThing
IThatThing
,并返回它接收的相同类型。唉,编译器被以下消息阻塞:

类型“T&I字符串”不可分配给类型“T扩展I字符串”?i提示:i提示。


有人能帮我澄清一下吗?我觉得我很接近,但还没有完全正确。我在这篇博文中使用了第一个示例(看起来很相似):

Typescript不允许您为仍然具有自由类型参数的条件类型分配任何内容,它只是不受支持。最好的选择是使用泛型和条件类型的签名,以及返回两种可能性的并集的更简单的实现签名

export interface IThisThing {
    someProp: number;
}

export function isIThisThing(type: any): type is IThisThing { 
    return !!type.someProp;
}

export interface IThatThing {
    someOtherProp: string;
}

export function isIThatThing(type: any): type is IThatThing { 
    return !!type.someOtherProp;
}

function doAThing<T extends IThisThing | IThatThing>(
    data: T
): T extends IThisThing ? IThisThing : IThatThing
function doAThing(
    data: IThisThing | IThatThing
): IThisThing | IThatThing {
    if (isIThisThing(data)) { 
        return data;
    };
  return data;
}
导出接口i测试{
someProp:数字;
}
导出函数是thisthing(类型:any):类型是thisthing{
return!!键入.someProp;
}
导出接口IThatThing{
其他一些道具:字符串;
}
导出函数为thing(类型:any):类型为IThatThing{
return!!键入.someOtherProp;
}
函数doAThing(
数据:T
):T是什么?IThatThing:IThatThing
函数doAThing(
数据:我是一个什么样的人
):Itishing | Ithatching{
如果(isithishing(data)){
返回数据;
};
返回数据;
}

只需返回
T

function doAThing<T extends IThisThing | IThatThing>(
    data: T
): T {
    if (isIThisThing(data)) { 
        return data
    } else {
        return data;
    }
}
函数doAThing(
数据:T
):T{
如果(isithishing(data)){
返回数据
}否则{
返回数据;
}
}

您能否详细说明“自由类型参数”的含义?我已经在谷歌上搜索过了,但是什么都没有出现。免费的意思是,在检查函数时,一些类型参数是不知道的。在这种情况下,taht是
T
。如果决策所基于的类型是已知的,那么您可以为条件类型分配一个值,例如,如果返回类型是
i,则它扩展了i?i测试:i测试
您可以为其分配一个兼容的valeu。