我有一些打字稿代码:
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;}'
答案 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
可能具有更多可能需要的属性,而不仅仅是value
(extends
部分只是说value
是这些属性之一,并且(必须为字符串),并且由于函数的返回类型为T
,因此TypeScript不想假设{ value: fieldValue }
始终为T
,除非您通过强制转换对象。