要了解出了什么问题,首先,让我们检查返回位置的类型。它的value 属性具有以下类型(如预期的那样):
{ valueType: string; value?: string | undefined; } | undefined;
让我们也看看input?.valueType ? input : undefined 给我们带来了什么:
Partial<{
valueType: string;
value?: string | undefined;
}> | undefined
这就是问题所在:您告诉编译器您希望 valueType 是 string 类型,但您实际尝试分配给它的是 string | undefined(显然是因为 Partial 助手使 @987654331 @属性可选)。
Partial<T> | undefined 是推断出来的,因为您还告诉编译器 generate 函数接受 Partial<MyType['value']> 作为第二个参数。现在,你能做些什么呢?在不改变语义的情况下,唯一合理的选择是将valueType 也设为可选:
type MyType = {
greeting: string;
value?: {
valueType?: string;
value?: string;
};
};
function generate(name: string, input?: Partial<MyType['value']>): MyType {
const value = input?.valueType ? input : undefined;
return { greeting: `Hello, ${name}`, value }; //OK
}
这可能不是您想要的。但是,为了实现您的目标,您需要可选链接来充当类型保护并“映射”您告诉编译器的类型为 Partial 以删除修饰符。这可以通过用户定义的type guard 实现,如下所示:
const withType = (val: Partial<MyType["value"]>) : val is Exclude<MyType["value"], undefined> => !!val?.valueType;
function generate(name: string, input?: Partial<MyType['value']>): MyType {
const value = withType(input) ? input : undefined;
return { greeting: `Hello, ${name}`, value }; //OK
}
Playground