使用Typescript声明了一个类型,但是Javascript在内部使用了错误的类型

问题描述 投票:0回答:1

我对Typescript还是很陌生,并通过一个教育视频来工作。昨天我发现了一个奇怪的行为,并认为这是一个错误。示例:

const json = '{"x": 10, "y":10}';
const coordinates: { x: number; y: number } = JSON.parse(json);

console.log(typeof coordinates.y);

通常输出x和y作为类型编号。但这不是因为类型声明,而是因为JSON值。如果将其中一个声明为String,则VS Code会将其视为String,但在内部会保留数字:

const json = '{"x": 10, "y":10}';
const coordinates: { x: number; y: string } = JSON.parse(json);

console.log(typeof coordinates.y);

这是代码:

The y variable is typed as a string

如您所见,VS Code将其视为字符串

The output of this is type number

但是类型检查证明这是不正确的。

我认为解析后的对象/数组具有任何类型都是有意义的。但是,如果解析的JSON值与注释不同,它应该是向您发送错误消息,或者应该将给定值精确地修改为注释。

我对此很陌生,所以如果我的假设是错误的,请告诉我!

javascript json typescript typechecking jsonparser
1个回答
0
投票

Typescript在compilation之前和之中进行推断。编译为JS后,如果您的某些代码类型逻辑不正确,则您声明的某些类型可能无效。这就是这里发生的事情。

JSON.parse返回类型为any的东西,可以是字面意义上的任何东西。您可以尝试使用以下命令从中提取属性:

const coordinates: { x: number; y: string } = JSON.parse(json);

但是这并不意味着所解析的对象实际上将具有x属性作为数字,或具有y属性作为字符串-您的代码告诉编译器assume确实有,并在稍后的代码中将y视为字符串。

如果您具有类型为any默认情况下,则从中提取属性时,应确保其属性确实属于您要指定的类型。否则,就像这里发生的一样,您可以告诉编译器false某些东西,结果可能会发生错误和奇怪的事情。

© www.soinside.com 2019 - 2024. All rights reserved.