Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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声明了一个类型,但Javascript内部使用的类型错误_Javascript_Json_Typescript_Typechecking_Jsonparser - Fatal编程技术网

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

使用Typescript声明了一个类型,但Javascript内部使用的类型错误,javascript,json,typescript,typechecking,jsonparser,Javascript,Json,Typescript,Typechecking,Jsonparser,我对打字和制作教育视频很陌生。昨天我发现了一个奇怪的行为,认为这是一个错误。 示例: constjson='{“x”:10,“y”:10}'; 常量坐标:{x:number;y:number}=JSON.parse(JSON); 控制台日志(坐标类型y); 这通常输出x和y作为类型编号。但这不是因为类型声明,而是因为JSON值。 如果将其中一个声明为字符串,VS代码将其视为字符串,但在内部它保持为数字: constjson='{“x”:10,“y”:10}'; 常量坐标:{x:number;y

我对打字和制作教育视频很陌生。昨天我发现了一个奇怪的行为,认为这是一个错误。 示例:

constjson='{“x”:10,“y”:10}';
常量坐标:{x:number;y:number}=JSON.parse(JSON);
控制台日志(坐标类型y);
这通常输出x和y作为类型编号。但这不是因为类型声明,而是因为JSON值。 如果将其中一个声明为字符串,VS代码将其视为字符串,但在内部它保持为数字:

constjson='{“x”:10,“y”:10}';
常量坐标:{x:number;y:string}=JSON.parse(JSON);
控制台日志(坐标类型y);
这是代码:

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

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

在我看来,解析后的对象/数组具有any类型是有道理的。但是,如果解析的JSON值与注释不同,则应该向您发送一条错误消息,或者应该将给定的值完全变形为注释


我对这个很陌生,所以如果我的假设是错误的,请让我知道

Typescript在编译之前和编译期间进行推理。编译到JS后,如果代码的某些类型逻辑不健全,则您声明的某些类型可能无效。这就是这里发生的事情

JSON.parse
返回类型为
any
的内容,可以是任何内容。您可以尝试使用以下行从中提取属性:

const coordinates: { x: number; y: string } = JSON.parse(json);
但这并不意味着解析后的对象实际上将有一个
x
属性作为一个数字,或者有一个
y
属性作为一个字符串-那里的代码告诉编译器假设它有,并在代码的后面将
y
作为一个字符串处理

如果在默认情况下,您有类型为
any
的内容,那么从中提取属性时,您应该确保其属性确实是您指定的类型。如果您不能100%确定属性将始终符合预期(例如,如果输入字符串来自网络响应-如果响应为
503
?),请创建一个类型保护,例如:

const isCoordinates = (param: unknown): param is { x: number, y: number } => {
    return typeof param === 'object' && param !== null && 'x' in param;
};
然后调用
isCoordinates
,然后再尝试从字符串中提取属性,以确保它的格式符合您首先期望的格式

否则,就像这里发生的事情一样,您可以告诉编译器一些错误的东西,结果可能会出现bug和奇怪的事情


你可以考虑启用TSLLT规则避免这些错误。

< P>脚本在编译之前和编译过程中都进行推理。编译到JS后,如果代码的某些类型逻辑不健全,则您声明的某些类型可能无效。这就是这里发生的事情

JSON.parse
返回类型为
any
的内容,可以是任何内容。您可以尝试使用以下行从中提取属性:

const coordinates: { x: number; y: string } = JSON.parse(json);
但这并不意味着解析后的对象实际上将有一个
x
属性作为一个数字,或者有一个
y
属性作为一个字符串-那里的代码告诉编译器假设它有,并在代码的后面将
y
作为一个字符串处理

如果在默认情况下,您有类型为
any
的内容,那么从中提取属性时,您应该确保其属性确实是您指定的类型。如果您不能100%确定属性将始终符合预期(例如,如果输入字符串来自网络响应-如果响应为
503
?),请创建一个类型保护,例如:

const isCoordinates = (param: unknown): param is { x: number, y: number } => {
    return typeof param === 'object' && param !== null && 'x' in param;
};
然后调用
isCoordinates
,然后再尝试从字符串中提取属性,以确保它的格式符合您首先期望的格式

否则,就像这里发生的事情一样,您可以告诉编译器一些错误的东西,结果可能会出现bug和奇怪的事情


你可以考虑启用TSLLT规则避免这些错误。

这是意料之中的。TS什么都不做——您已经以某种方式声明了您的类型,而TS只是相信您的话。编译器在运行前工作,所以TS不可能知道运行时会有什么值,因为TS当时不存在。因此,编译器只处理它所知道的信息——您所说的类型是什么。这是意料之中的。TS什么都不做——您已经以某种方式声明了您的类型,而TS只是相信您的话。编译器在运行前工作,所以TS不可能知道运行时会有什么值,因为TS当时不存在。因此,编译器只使用它所知道的信息——您所说的类型。“Typescript在编译之前和编译期间进行推理。”我们应该对此有一些规范。我看到很多人假设他们在某种程度上“运行TypeScript代码”,就好像运行时存在类型一样。此外,为了补充这个答案,除了类型保护之外,您还可以使用接收数据并尝试确保其正确性的代码。因此,您可以执行类似于
data=>{return{x:Number(data.x),y:Number(data.y)}}
的操作,以便生成正确形状和类型的内容。当然,如果默认值不存在,可以添加更多的逻辑,比如默认值,但至少最后你知道你有适合自己类型的东西。嗯,好吧,这意味着不检查显式类型是否有效就传播解析的Json对象是没有意义的。对我个人来说,这是非常错误的,因为我不可能申报任何没有在后台处理过的东西。在我看来,当字符串不是实际字符串时,应该抛出一个错误。即使它来自任何类型。但是谢谢你的解释!我会记住的。@ChrisPi是的。如果你想成为t