带有泛型和分部的类上的Typescript错误

带有泛型和分部的类上的Typescript错误,typescript,Typescript,我在泛型类型上使用分部时遇到问题: interface HasName { name: string; } class Tools<T extends HasName> { public create: (params: Partial<T>) => T; createWithName = (nameArg: string) => { this.create({ name: nameArg }) } } 接口名称{ 名称:字符串;

我在泛型类型上使用分部时遇到问题:

interface HasName {
  name: string;
}

class Tools<T extends HasName> {
  public create: (params: Partial<T>) => T;
  createWithName = (nameArg: string) => {
    this.create({ name: nameArg })
  }
}
接口名称{
名称:字符串;
}
类工具{
公共创建:(参数:部分)=>T;
createWithName=(nameArg:string)=>{
创建({name:nameArg})
}
}
我希望这个例子能起作用,因为
T extends HasName
应该确保
T
将有一个
name
字段,并且
(params:Partial)
应该将任何对象与
T
的任何键子集相匹配

但是,在这行
上有一个typescript编译错误。创建({name:nameArg})

类型为“{name:string;}”的参数不能分配给类型为“Partial”的参数

有人能帮我理解为什么
{name:string}
不能分配给
部分
,而它应该基于我上面的逻辑吗


提前谢谢。

简言之,TypeScript是正确的,但只要您小心使用
T
,您就可以通过强制转换来消除错误:

this.create({ name: nameArg } as Partial<T>)

在这种情况下,
{name:nameArg}
其中
nameArg
是任何字符串都不能分配给
Partial
,因为
string
不能分配给
“alice”|“bob”

您使用的是什么版本的typescript?我对您使用typescript 2.9的示例没有问题。2@JakeHolzinger我怀疑编译器不会试图在泛型参数上对映射类型进行推理。在您的情况下,这应该是可行的,并且实际上没有什么区别,我认为它实际上更准确
public create:(params:Partial)=>T@TitianCernicova Dragomir你说得对,我的IDE没有抱怨编译器错误。使用
create:(参数:Partial)=>T虽然有效,但问题很奇怪。为什么
创建:(params:Partial)=>T不使用
作为
?在这种情况下,
create
中的
T
是该函数的局部变量,并将根据给定给它的参数类型进行推断。它与
Tools
定义中的
t
不同了。如果您熟悉变量阴影,这将是相同的。在类级别声明的泛型类型
T
与在函数级别声明的泛型类型
T
有何不同?泛型类型是以相同的方式声明的,我不明白它们之间有什么区别,但最好知道它们之间有什么区别。
Tools
中的
t
create
中的
t
都是相似的,因为它们都扩展了
HasName
,但它们各自实现HasName的方式可能有所不同。例如,您可以编写类似于
const myTools:Tools=new Tools()
,然后继续编写
myTools.create({name:“charlie”})
而不出错,即使
{name:“charlie”}
不能分配给
hassspecificname
。回答得好!感谢您解释并提供cast解决方案。
interface HasSpecificName extends HasName {
    name: "alice" | "bob";
}