当可选属性和必选属性通过交集进行合并时,必选属性优先
type A = { who: string }
type B = { who?: string }
// $ExpectType {who:string}
type R = A & B
可能会导致运行时错误,例如在处理函数内的默认参数模式时。
type Params = {
who: string
greeting: string
}
const defaults: Params = {
greeting: 'Hello',
who: 'Johny 5',
}
function greeting(params: Partial<Params>){
// $ExpectType Params
const merged = {...defaults, ...params}
return `${merged.greeting.toUpperCase()} ${merged.who} !`
}
// @throws - TypeError: Cannot read property 'toUpperCase' of undefined
greeting({greeting:undefined, who: 'Chuck'})
问题:
我描述的是TS编译器的行为,现在问题是如何创建映射类型,将这个交叉类型解析成联合类型。
例如:
type SafeMerge<A,B>=....
// $ExpectType {greeting?: string | undefined, who?: string | undefined }
type Result = SafeMerge<Params, Partial<Params>>
混合类型示例:
// $ExpectType {one?: number | undefined, two: string, three: boolean }
type Result = SafeMerge<{one: number, two:string}, {one?: number, three: boolean}>