我一直在尝试键入递归序列化任意对象的输入法。我已经使用了映射类型,通用参数,递归类型(例如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)
}