Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript Object.entries(qs.forEach(…)-解析lambda忽略类型注释_Typescript - Fatal编程技术网

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)