我在尝试理解Typescript高级类型手册中的以下示例。
引用它说:
以下示例演示了在协变位置中为同一类型变量提供多个候选项会导致推断出一个联合类型:
同样地,协变位置上相同类型变量的多个候选项会导致推断出一个交集类型:
我的问题是:为什么第一个例子中的对象属性被认为是“协变位置”,而第二个函数参数被认为是“反变位置”?
此外,第二个例子似乎解析为never,不确定是否需要任何配置才能使其工作。
引用它说:
以下示例演示了在协变位置中为同一类型变量提供多个候选项会导致推断出一个联合类型:
type Foo<T> = T extends { a: infer U, b: infer U } ? U : never;
type T10 = Foo<{ a: string, b: string }>; // string
type T11 = Foo<{ a: string, b: number }>; // string | number
同样地,协变位置上相同类型变量的多个候选项会导致推断出一个交集类型:
type Bar<T> = T extends { a: (x: infer U) => void, b: (x: infer U) => void } ? U : never;
type T20 = Bar<{ a: (x: string) => void, b: (x: string) => void }>; // string
type T21 = Bar<{ a: (x: string) => void, b: (x: number) => void }>; // string & number
我的问题是:为什么第一个例子中的对象属性被认为是“协变位置”,而第二个函数参数被认为是“反变位置”?
此外,第二个例子似乎解析为never,不确定是否需要任何配置才能使其工作。