带有泛型和分部的类上的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";
}