typescript - 如何键入任意对象或其任何键作为方法参数
问题描述
我一直在尝试键入递归序列化任意对象的输入法。我使用了映射类型、泛型参数、递归类型(如 JSON 类型),但没有任何运气):
这是我试图摆脱any
参数中的方法:
export function serialize(data: any) {
if (data === null) {
return '';
}
if (typeof data === 'object') {
let serializedData = '';
for (const k of Object.keys(data).sort()) {
serializedData += k;
if (data[k] !== null) {
serializedData += serialize(data[k]);
}
}
return serializedData;
}
return data.toString();
}
解决方案
您需要一个自定义类型保护来将值细化为Record<string, unknown>
.
const isUnknownRecord = (u: unknown): u is Record<string, unknown> =>
typeof u === 'object' && u !== null
export function serialize(data: unknown): string {
if (data === null) {
return ''
}
if (isUnknownRecord(data)) {
let serializedData = ''
for (const k of Object.keys(data).sort()) {
serializedData += k
if (data[k] !== null) {
serializedData += serialize(data[k])
}
}
return serializedData
}
return String(data)
}
推荐阅读
- cakephp - cakephp:plumSearch - 在参数中更改过滤器的标签
- countvectorizer - CountVectorizer() : AttributeError: 'numpy.float64' 对象没有属性 'lower'
- javascript - 是否有必要明确“卸载”动态加载的javascript?
- pandas - Pandas:保持前三行包含每个唯一值的值
- ruby - 安装 gem 时强制编译 Ruby 扩展?
- tomcat - 使用安全端口配置数据源
- php - 服务器上的 PHP GET array0
- javascript - 如果返回的数据包含 NaN,则 jQuery $.get 不会执行
- hl7 - 如何识别带有HL7的设备?
- combobox - 在功能区 Visual Basic 中以编程方式创建组合框