作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在对通用类型使用部分时遇到问题:
interface HasName {
name: string;
}
class Tools<T extends HasName> {
public create: (params: Partial<T>) => T;
createWithName = (nameArg: string) => {
this.create({ name: nameArg })
}
}
我希望这个例子能够工作,因为 T extends HasName
应该确保 T
会有一个 name
领域,和(params: Partial<T>)
应将任何对象与 T
的键的任何子集匹配.
然而,在this.create({ name: nameArg })
行出现typescript编译错误:
Argument of type '{ name: string; }' is not assignable to parameter of type 'Partial'.
谁能帮我理解为什么{ name: string }
不可分配给 Partial<T>
,什么时候应该根据我上面的逻辑?
提前谢谢你。
最佳答案
简而言之,TypeScript 是正确的,但只要您谨慎使用T
的内容即可。 ,你应该可以通过强制转换来消除错误:
this.create({ name: nameArg } as Partial<T>)
至于为什么 TypeScript 在这里,是因为您可以创建扩展 HasName
的类型但为此{name: string}
不是该类型的有效对象。
最简单的例子就是创建一个 name
的类型比 string
更具体:
interface HasSpecificName extends HasName {
name: "alice" | "bob";
}
在这种情况下,{name: nameArg}
其中 nameArg
是否有任何字符串不可分配给 Partial<HasSpecificName>
自 string
不可分配给 "alice" | "bob"
.
关于带有泛型和部分的类的 typescript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51110424/
我是一名优秀的程序员,十分优秀!