Generics 为什么以下泛型约束会产生编译器错误?

Generics 为什么以下泛型约束会产生编译器错误?,generics,types,compiler-errors,type-constraints,Generics,Types,Compiler Errors,Type Constraints,以下受约束的泛型函数 接口Alpha { 成员1:编号:, 成员2:字符串, } 界面测试版 { member1:string, 成员2:字符串, } 函数转换(s:源):目标 { 返回{ s member1:s.member1.toString(), }; } 常数a:Alpha={member1:12,member2:'hello'}; 常数b:Beta=转换(a); …正在生成此编译器†错误(其中第16行是return语句的开头): 当然,如果我正在执行编译器的工作,并且自己手动创建泛型

以下受约束的泛型函数

接口Alpha
{
成员1:编号:,
成员2:字符串,
}
界面测试版
{
member1:string,
成员2:字符串,
}
函数转换(s:源):目标
{
返回{
s
member1:s.member1.toString(),
};
}
常数a:Alpha={member1:12,member2:'hello'};
常数b:Beta=转换(a);
…正在生成此编译器†错误(其中第
16行是
return
语句的开头):

当然,如果我正在执行编译器的工作,并且自己手动创建泛型函数的特定版本,那么它将按照预期工作,不会出现警告或错误:

函数转换(a:Alpha):Beta
{
返回{
A.
member1:a.member1.toString(),
};
}
因此,我的问题是:

  • 为什么上述定义不能按预期工作?
  • 以及如何以不同的方式表达这种约束,以便它能够编译?


†编译器版本:
3.2.2

Target
,作为
Beta
的扩展,可以有任意数量的新字段,您不会返回这些字段-您只是返回带有更改字段的
Source

一种可能的修复方法是更改convert的签名以匹配实现:

函数转换(s:Source):Beta&{member1:string}{

请记住,在任何情况下,您都无法从泛型类型(相关)进行传播。

我不同意您的评论的前半部分,因为1。编译器可能有足够的信息(通过显式类型参数或通过可推断的赋值等)来推断源类型和目标类型,并比较这两种类型是否可以在
convert
函数或2中实现时进行转换。如果没有足够的可用信息来决定该做什么,编译器应该抱怨。OTOH我认为你联系的问题看起来很有希望,一旦我有足够的时间,我会深入阅读。为你的答案干杯,+1。编译器只能在调用站点获得消除泛型歧义的信息。在函数定义中,你告诉编译器你可以返回任何Beta的任意子类型,但实现可以在其他情况下工作:你返回的源代码中有一个更改的字段。编译器正确理解编写的实现不能返回任意目标。这与推理无关,编译器只是告诉我们代码没有返回定义所告诉的内容。
main.ts:16:5 - error TS2322: Type 'Source & { member1: string; }'
               is not assignable to type 'Target'