typescript - typescript 中的什么类型应该用于在编译时字段未知的对象?
问题描述
我有以下功能:
const doSomething = (param: object) => {
// path param to another function/library
}
关键是我知道(并且想要强制执行)这param
是一个对象,而不是原始类型。在 typescript中object
完成了这个角色。
但是我注意到:
const a: object = {
test: 5
}
console.log(a.test)
给出一个打字稿错误:Property 'test' does not exist on type 'object'.
这是否意味着object
应该只用于空对象?
我想知道在编译时不知道对象的确切字段的打字稿中声明对象变量的最佳做法是什么。我注意到:
const b: Record<string, any> = {
test: 5
}
console.log(b.test)
不会导致错误。那么应该Record
首选 type 而不是object
?
解决方案
我认为对此的两种解决方案可能是将参数声明为记录,或者在运行时检查类型并在参数不是对象时抛出异常。
对于第一种方法,您可以这样做:
const doSomething = (param: Record<string, any>) => {
// path param to another function/library
}
对于第二种方法,您可以这样做:
const doSomething = (param: any) => {
if(typeof param !== 'object') throw new Error("Not an object")
// path param to another function/library
}
但是,我不得不说,如果这个参数来自您自己的代码之外(如在框架中左右),您将不会编译该参数,因此您的编译时错误将不存在。如果确实在您自己的代码中声明了该对象,那么当代码设计良好时,通常不会遇到此类问题。
必须绕过遍布各处的 TS 类型检查,这对您来说是一个很大的缺点any
。也许有了更多的上下文,我们可以找出设计中可以改变的地方,这样你就不必处理这个了:)
推荐阅读
- javascript - WooCommerce 自定义 checkout.js - 以帐单地址作为送货地址的订单
- css - 在菜单上放置 Bootstrap 徽章
- bash - 通过脚本自动创建 GNU-Screen 会话
- javascript - 使用 PrimeNG 以角度方式绑定 $event
- c++ - c++:关于 for 语句和参数的一般 q
- scala - Spark 2.2.0 - 如何从 EC2 列出 S3 存储桶中的文件
- firebase - Firebase 控制台读取成本
- html - 修复了 Div 在整个屏幕上的拉伸,需要每个占据 % 的水平空间
- apache-spark - Spark 数据框 na.fill 布尔列类型
- sql - 如何在 db2 过程中锁定多条记录?