我对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);
这是代码:
如您所见,VS Code将其视为字符串
但是类型检查证明这是不正确的。
我认为解析后的对象/数组具有任何类型都是有意义的。但是,如果解析的JSON值与注释不同,它应该是向您发送错误消息,或者应该将给定值精确地修改为注释。
我对此很陌生,所以如果我的假设是错误的,请告诉我!
Typescript在compilation之前和之中进行推断。编译为JS后,如果您的某些代码类型逻辑不正确,则您声明的某些类型可能无效。这就是这里发生的事情。
JSON.parse
返回类型为any
的东西,可以是字面意义上的任何东西。您可以尝试使用以下命令从中提取属性:
const coordinates: { x: number; y: string } = JSON.parse(json);
但是这并不意味着所解析的对象实际上将具有x
属性作为数字,或具有y
属性作为字符串-您的代码告诉编译器assume确实有,并在稍后的代码中将y
视为字符串。
如果您具有类型为any
的默认情况下,则从中提取属性时,应确保其属性确实属于您要指定的类型。否则,就像这里发生的一样,您可以告诉编译器false某些东西,结果可能会发生错误和奇怪的事情。