typescript - 为什么打字稿不能通过泛型函数验证返回类型?
问题描述
我想用泛型验证返回类型。但是像吹这样的行为让我很困惑:
interface IT {
name: string;
}
interface check<T> {
get(): Partial<T>;
};
// works
var g: check<IT> = {
get() {
return {
name: 'sdsdf',
error: 'asdad'
}
}
}
// error
var e: check<IT> = {
get() {
return {
name: 123
}
}
}
// error
var f: check<IT> = {
get() {
return {
error: 'asdad'
}
}
}
为什么当返回类型扩展泛型类型时,它可以通过类型检查?
解决方案
想知道为什么{ name: '123', error: '123' } 也可以通过类型检查。错误没有被定义
这是因为可分配性。
请考虑下一个示例:
interface IT {
name: string;
}
interface check<T> {
get(): Partial<T>;
};
var g: check<IT> = {
get() {
return {
name: 'sdsdf',
error: 'asdad'
}
}
}
interface IT2 {
name: string,
error: string
}
declare var a: IT
declare var b: IT2
a = b // ok
b = a // error
如您所见,可以将 IT2 分配给 IT,但反之则不行。
但为什么???
这就是 TypeScript 中类型的工作方式。请参阅文档的第一个示例
类型检查器检查对 printLabel 的调用。printLabel 函数有一个参数,该参数要求传入的对象具有称为字符串类型标签的属性。请注意,我们的对象实际上具有比这更多的属性,但编译器仅检查是否至少存在所需的属性并匹配所需的类型。在某些情况下,TypeScript 不那么宽松,我们稍后会介绍。
TypeScript中没有Exact
类型,但是这里有一个打开的输入链接描述
请记住,下一个代码将失败:
const bar = g.get().error // error
推荐阅读
- reactjs - 同时反应路由器列表和详细路由
- xml - 如何为博客模板导航栏的xml循环中的不同链接添加不同的图标?
- pharo - Pharo 状态已损坏,如何保存我的代码?
- sonarqube - sonarqube 6.7 中不存在恢复内置配置文件菜单
- java - 不使用原始类型无法获取泛型类型的类对象
- php - laravel如何保护从刀片到控制器的数据传递
- javascript - 如何使用 javascript 将 json prettry 格式输出为 html?
- reactjs - 酶 / Jest 间谍未调用 onClick
- javascript - 为什么联系表电子邮件在某些字段中发送“值”而不是“名称”?
- chromium-embedded - 本地文件系统中带有 html/js 文件的 Cefpython 应用程序