当 T 扩展 U 时,为什么不能将 U 分配给 Partial? [复制]

2024-01-02

例如:

interface U {
  u: boolean;
}

const f = <T extends U>() => {
  const t: Partial<T> = {u: true};
};

我收到以下错误:

Type '{ u: true; }' is not assignable to type 'Partial<T>'.ts(2322)

有没有办法解决这个问题而不需要强制转换?


TypeScript 抱怨的问题如下:

Type '{ u: true; }' is not assignable to type 'Partial<T>'.ts(2322)

你的职能f可以这样调用:

f<{ u: boolean, v: boolean }>(); // ok since U is "implemented" but not "v"

这将打开一个选项,您的泛型和您提供的函数内对象的具体实现{ u: true }可能会有所不同。

TypeScript 编译器不会强制您定义与其扩展相同的类型,只要完全提供 U,您仍然可以指定 U 的更具体的实现(在本例中为布尔标志)u).

一些可能的解决方案是:

使用类型转换(如之前使用的):

interface U {
  u: boolean;
}

const f = <T extends U>() => {
  const t: Partial<T> = {u: true} as Partial<T>;
};

f<U>();

缺点: { u: true }很可能被替换为:{ v: true }这可能会导致代码中出现未定义的问题。

尝试重新表述你的函数

告诉编译器准确使用类型U,如果可能的话,您可以尝试重新表述该函数并移动常数t作为函数参数。

interface U {
  u: boolean;
}

const f = <T>(u: T) => {
  const t: Partial<T> = u;
};

f<{ u: boolean }>({ u: true });

考虑泛型是否相关

您的函数需要一个泛型类型,但您的函数体分配了一个具体类型,这会导致这里出现问题。您可以考虑泛型是否相关。一个通用的免费替代方案是:

interface U {
  u: boolean;
}

const f = () => {
  const t: Partial<U> = {u: true};
};

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

当 T 扩展 U 时,为什么不能将 U 分配给 Partial? [复制] 的相关文章

随机推荐