typescript - 打字稿中的类型对象是什么?
问题描述
什么是类型对象,何时使用?好像是黑匣子?如果参数可以有未知种类的对象键,应该使用哪种解决方案 A 或 B?
一个
const edit: (value: object) => void = value=> {// do something }
edit({name: "Bob", age: 11})
乙
type JSONObject = { [k: string]: string | number}
const edit: (value: JSONObject ) => void = value=> {// do something }
解决方案
type
是您声明为参考的东西。在您的B
示例中,如果您运行以下代码:
const myObject:JSONObject = objFromFunction();
Object.values(myObject).map(objValue => { /* 'objValue' is of type 'string' or 'number' */ });
这比示例 A 更可取,示例 AobjValue
的类型为any
,它是 TypeScript 环境中的“黑匣子”。
当您声明一个类型时,您正在分配一个可以分配的潜在值的范围。根据edit()
使用方式,您可以设置各种类型的策略。
如果您知道该对象将显式存在{name:string, age:number}
,那么您可以这样声明您的类型:
type Person = { name:string; age:number };
如果您只知道对象属性可能只包含一个字符串或一个数字,那么您可以像您的示例一样声明一个类型,但您可以使用Record
:
type JSONObject = Record<string, string | number>;
最后,如果您不知道对象中包含的类型,我建议您稍作更改并使用unknown
type JSONObject = Record<string, unknown>;
使用object
会将任何属性值标记为any
不提供类型保护。unknown
为您提供更好的类型保护,我不会在这里讨论。unknown
你应该能够找到关于为什么更喜欢的文章和问答any
。
推荐阅读
- ruby-on-rails - ruby sorbet 无法在 CentOS7 上运行
- arrays - VBA:将数组写入块中的工作表(一次内存访问)
- php - 在 wordpress 中看不到特定图像的 URL
- java - 带有 Dagger 和 AndroidInjectors 的子模块
- android - 在 ConstraintLayout 中使用 RecyclerView 时,所有 RecyclerView 项都不可见
- node.js - 如何计算事件循环(NodeJs)的总滴答声?
- php - How do I find occurence of element inside of first element xpath
- sql-server - SQL函数抛出错误最大限制错误
- java - MultipartFile 到 PDF 转换并下载此文件
- restructuredtext - 带有重组文本的超链接