为什么我不能返回通用“T”来满足 Partial

2024-04-27

我用 TypeScript 写了一些代码:

type Point = {
  x: number;
  y: number;
};
function getThing<T extends Point>(p: T): Partial<T> {
  // More interesting code elided
  return { x: 10 };
}

这会产生一个错误:

Type '{ x: 10; }' is not assignable to type 'Partial<T>'

这似乎是一个错误 -{ x: 10 }显然是一个Partial<Point>。 TypeScript 在这里做错了什么?我该如何解决?


当考虑编写泛型函数时,需要记住一条重要规则

调用者选择类型参数

您提供的合同getThing ...

function getThing<T extends Point>(p: T): Partial<T>

...意味着像这样的法律调用,其中T是一个子类型Point:

const p: Partial<Point3D> = getThing<Point3D>({x: 1, y: 2, z: 3});

当然,{ x: 10 } is合法的Partial<Point3D>.

但是子类型化的能力不仅仅适用于添加附加属性——子类型化还可以包括选择一组更受限制的属性本身的域。你可能有这样的类型:

type UnitPoint = { x: 0 | 1, y: 0 | 1 };

现在当你写的时候

const p: UnitPoint = getThing<UnitPoint>({ x: 0, y: 1});

p.x有价值10,即not合法的UnitPoint.

如果您发现自己处于这种情况,那么您的返回类型很可能实际上并不通用。更准确的函数签名是

function getThing<T extends Point>(p: T): Partial<Point> {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能返回通用“T”来满足 Partial? 的相关文章

随机推荐