可分配给类型,但无法用其他子类型实例化

时间:2020-03-17 21:59:40

标签: typescript

我有一些打字稿代码:

const wrapField = <T extends { value: string }>(fieldValue: string): T => ({
  value: fieldValue,
});

打字稿给我一个错误:

'{ value: string; }' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '{ value: string; }'

我不确定自己在做什么错,它们都是'{value: string;}'

2 个答案:

答案 0 :(得分:0)

正如TypeScript团队的Ryan Cavanaugh所解释的,类似fn<T extends SomeType>(): T cannot possibly be implemented correctly之类的函数。他接着说:

人们想写

const x = fn<SomeType>();

什么意思

const x = fn() as SomeType;

因为类型断言感觉不好

泛型用于两个或多个类型之间的关系。在您的函数中,没有这种关系-返回类型始终相同,并且不依赖任何内容。您可以不使用泛型来编写它。

const wrapField = (fieldValue: string): { value: string } => ({
  value: fieldValue,
});

答案 1 :(得分:-1)

编辑:如@Karol Majewski所述,在此特定情况下,您可能不需要通用函数。但是,我下面的回答与错误有关,即在保持功能通用的情况下解决问题,以防其他人遇到相同的错误,或者这只是问题的简化版本。


您必须将其投射,即:

const wrapField = <T extends { value: string }>(fieldValue: string): T => ({
  value: fieldValue,
} as T);

问题在于,T可能具有更多可能需要的属性,而不仅仅是valueextends部分只是说value是这些属性之一,并且(必须为字符串),并且由于函数的返回类型为T,因此TypeScript不想假设{ value: fieldValue }始终为T,除非您通过强制转换对象。