typescript - TypeScript 泛型函数参数和返回类型推断
问题描述
这两个函数定义有什么区别?
使用 first getProperty
,TypeScript 可以推断返回类型。但是第二个失败了。
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
function getProperty2<T>(obj: T, key: keyof T) {
return obj[key];
}
let obj = {
a: 1,
name: 'test',
}
const name2 = getProperty(obj, 'name');
name2.length; // This is OK, name2 is infered as string
const name3 = getProperty2(obj, 'name');
name3.length; // This is ERROR! name3 is of type string | number
解决方案
在第一个上,K
是明确定义的。因此,当您通过 时name
,Typescript 可以推断类型。但是在第二个中,getProperty2
函数需要 any keyof
T
。因此,返回类型变为string | number
(如果您向 中添加更多键obj
,这将变得更加复杂)。这就是为什么 Typescript 不确定你会得到哪一个。
您可以使用as
以下方法解决此问题,因为您确信您会得到string
回报。
const name3 = getProperty2(obj, 'name') as string;
name3.length;
推荐阅读
- python - 如何将额外的图像添加到 cifar10 数据集以在 keras 中学习?
- html - 如何将 CSV 中的书签读入 HTML 书签输入文件?
- ruby - 对“自我”的这种使用感到非常困惑;'参数.方法'
- laravel - .htaccess 的目录被更改
- mongodb - Mongodb查询返回字段值
- sql-server - 在 SQL 代理作业中由 SSIS 项目 FTP 任务下载时损坏的图像
- android - 我可以使用除我开发的 Android 应用程序以外的任何浏览器限制访问我的网站吗?
- openstreetmap - 如何在一个行政区域内找到所有方法
- python - 使用带有构造函数的 MySQL 连接器
- c - 为什么在 MASM 汇编中使用 FPU x87 指令集执行操作时得到无意义的数字?