Typescript Object.entries(qs.forEach(…)-解析lambda忽略类型注释
我有一个对象Typescript Object.entries(qs.forEach(…)-解析lambda忽略类型注释,typescript,Typescript,我有一个对象exampleMap,它实现了DictionaryNum,用作键值存储。我使用一个对象,因为Map不适用于例如JSON.stringify interface DictionaryNum<T> { [id: number]: T; } let exampleMap = { [1]: 1, } 问题是,尽管我使用了两次类型注释(函数参数,lambda),并且没有产生错误,但在传输时,键是一个字符串,尽管TypeScript认为它是一个数字。因此,当我在构造
exampleMap
,它实现了DictionaryNum
,用作键值存储。我使用一个对象,因为Map不适用于例如JSON.stringify
interface DictionaryNum<T> {
[id: number]: T;
}
let exampleMap = {
[1]: 1,
}
问题是,尽管我使用了两次类型注释(函数参数,lambda),并且没有产生错误,但在传输时,键是一个字符串,尽管TypeScript认为它是一个数字。因此,当我在构造函数中使用它时,对象将以对象中的字符串结束。
显然,这不是我想要的。我预期会出现隐式转换或错误
我的问题是:
获得所需行为的最佳方法是什么。
目前,我使用了parseInt(qP)
并删除了类型注释,但这似乎不是最佳解决方案,因为这正是我不想用JavaScript编写代码的原因
*保持:
- 快速访问单个值
- 键/值上的快速迭代
- JSON.stringifyable
对象。条目
声明:
entries<T>(o: { [s: string]: T } | ArrayLike<T>): [string, T][];
查看
对象。条目
声明:
entries<T>(o: { [s: string]: T } | ArrayLike<T>): [string, T][];
Object.entries(obj)
生成一个[string,any]
数组(或者如果obj
是一个T
数组,或者是一个字符串键控字典,其值都是T
),则可能生成一个合适的T
数组。这是因为,即使对于数组,JavaScript实际上也会将所有索引(除了symbol
索引)转换为字符串。所以{“1”:“hey”}
和{1:“hey”}
是相同的值,具有相同的类型。TypeScript公开了编号
索引,以方便处理数组和类似数组的对象,但从技术上讲,这是一个谎言。事实上,数组键的类型类似于numericString
,这显然是任何人都可以处理的
无论如何,您的问题是:为什么编译器不在forEach()
回调中执行隐式转换或抛出错误
答:TypeScript不进行隐式转换,这将违反基于类型信息发出不同JS代码的规定。。。类型系统在运行前被完全擦除。您只需要自己将字符串转换为数字,或者使用其他数据结构来表示字典(例如,一个[number,number]
对数组,或者一个映射
)
至于抛出错误,这对您来说是合理的。但是,不幸的是,any
类型(又称类型系统的“逃生舱”)正在抑制这一点。您正在获取一个类型应为[string,any]
的值,并将其视为数字[]
。TypeScript很乐意将元组类型(如[a,B]
视为数组
)。但是[string,any]
可以像Array
一样处理,也就是any[]
,也可以像number[]
一样处理,而不必抱怨。这对你来说是不幸的
要恢复某种类型安全性的外观,您可以通过类型断言使用Object.entries(dict)
的另一个重载:
Object.entries(dict as Record<string, number>)
Object.entries(dict as Record)
这将导致Object.entries()
返回一个数组
,并且您的代码将出错,除非您实际将键视为字符串
。与此不同的是,标准库不希望有人向Object.entries()
传递非数组型数字索引。如果使用数组(具有length
属性的对象),它也会捕获错误
因此,这是一系列令人遗憾的边缘案例,咬了你一口。很抱歉不管怎样,希望这有帮助。祝你好运 Object.entries(obj)
生成一个[string,any]
数组(或者可能是[string,T]
,用于合适的T
,如果obj
是一个T
数组或一个字符串键控字典,其值都是T
)。这是因为,即使对于数组,JavaScript实际上也会将所有索引(除了symbol
索引)转换为字符串。所以{“1”:“hey”}
和{1:“hey”}
是相同的值,具有相同的类型。TypeScript公开了编号
索引,以方便处理数组和类似数组的对象,但从技术上讲,这是一个谎言。事实上,数组键的类型类似于numericString
,这显然是任何人都可以处理的
无论如何,您的问题是:为什么编译器不在forEach()
回调中执行隐式转换或抛出错误
答:TypeScript不进行隐式转换,这将违反基于类型信息发出不同JS代码的规定。。。类型系统在运行前被完全擦除。您只需要自己将字符串转换为数字,或者使用其他数据结构来表示字典(例如,一个[number,number]
对数组,或者一个映射
)
至于抛出错误,这对您来说是合理的。但是,不幸的是,any
类型(又称类型系统的“逃生舱”)正在抑制这一点。您正在获取一个类型应为[string,any]
的值,并将其视为数字[]
。TypeScript很乐意将元组类型(如[a,B]
视为数组
)。但是[string,any]
可以像Array
一样处理,也就是any[]
,也可以像number[]
一样处理,而不必抱怨。这对你来说是不幸的
要恢复某种类型安全性的外观,您可以通过类型断言使用Object.entries(dict)
的另一个重载:
Object.entries(dict as Record<string, number>)
Object.entries(dict as Record)