【发布时间】:2019-10-29 10:05:18
【问题描述】:
给定一个接收相同泛型类型的两个参数的函数:
declare const fn: <T>(t1: T, t2: T) => any;
我试图推断 TypeScript 在调用此函数时的不同行为。
当 2 个参数都是不同的原语时:
fn(1, 'foo'); // Error due to different types
当两个参数都是不同的对象时:
fn({ foo: 1 }, { bar: 1 }) // No error and return type is union of different types
为什么这两种用法没有相同的行为?我希望他们都表现得一样。要么:
- 不同类型导致的错误
- 没有错误,返回类型是不同类型的并集
其次,如果传入的参数之一是变量(而不是内联对象文字),TypeScript 的行为又会有所不同:
fn({ foo: 1 }, { bar: 1 }) // No error and return type is union of different types
const obj = { foo: 1 };
fn(obj, { bar: 1 }) // Error due to different types
再一次,这两种用法为什么不具有相同的行为?我希望这两种情况的行为相同。
【问题讨论】:
-
这个问题可能与 TypeScript 中的推理方式有关。很高兴推断两个对象的联合,因为推断的对象类型好像它们在“其余”属性中是多态的,而不是被关闭的,而
1和'foo'不是多态的。关于“封闭”对象类型的某处存在问题,因此{ foo: "bar", baz: "quux" }是不可接受的{ | foo: "bar" | }。如果推断的对象字面量类型是{ | ... | }而不是{ ... },则不会遇到此问题。
标签: typescript generics