typescript - 打字稿:从地图或对象中获取键
问题描述
假设我想编写一个函数,该函数将来自 aMap
或普通对象的键作为普通数组返回,如下所示:
function keys <K>(m: Map<K, any> | { [key: string]: any }) {
if (m instanceof Map) return Array.from(m.keys())
return Object.keys(m)
}
如果我然后尝试从普通对象中检索密钥,那效果很好:
let a = ((g: string[]) => g)(keys({})) // this works
但是,使用 aMap<number, number>
会给我一个类型错误:
let a = ((g: number[]) => g)(keys(new Map<number, number>()))
// Argument of type 'number[] | string[]' is not assignable to parameter of type 'number[]'
let a = ((g: number[]) => g)(keys<number>(new Map<number, number>()))
// Even this produces the same error
let a = ((g: number[]) => g)(keys(new Map<number, number>()) as number[])
// This works but the cast kind of defeats the purpose
我错过了什么?我应该如何输入这个来让 TypeScript 编译器理解我的意思?
更新:
函数签名重载似乎是这里的方法,这个版本工作正常:
function keys <K>(m: Map<K, any>): K[]
function keys (m: { [key: string]: any }): string[]
function keys (m: any): any {
if (m instanceof Map) return Array.from(m.keys())
return Object.keys(m)
}
解决方案
检查打字稿函数签名重载:https ://www.typescriptlang.org/docs/handbook/functions.html#overloads
您可以定义一组不同的签名,因此您可以为案例定义一个签名Map
,并为案例定义一个签名object
:
function keys <K>(m: Map<K, any>): K[]
function keys (m: { [key: string]: any }): string[]
function keys (m: any): any {
if (m instanceof Map) return Array.from(m.keys())
return Object.keys(m)
}
推荐阅读
- java - Upsource - PKIX 路径 SSL 证书问题
- android - 修复旧 Android 版本的 PDFium 崩溃或包含自己的库
- php - Guzzle内存消耗优化
- c# - 转换列表
> 成一个字典 - r - 在 R 中获取日期
- c# - 图表 API 列表加入了 isArchived =false 的团队
- three.js - Three.js perspectivecamera 'near' 和 'far' 参数
- lua - Scrapy-Splash如何将返回变量添加到响应中
- sql-server - 如何在 Crystal Report 9 的 blob 字段中显示图像数据类型
- python - Python - 在我定义它们之前如何从其他类获取信息/使用函数?