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类型分析的某些部分不一致? 接口X{ a:数字; } 常数x:x={ a:9, //somethingElse:8//这将导致预期的编译错误 }; 常数y={ a:9, 大概是:8 }; 常数xx:X=y;//但这是有效的_Typescript - Fatal编程技术网

为什么typescript类型分析的某些部分不一致? 接口X{ a:数字; } 常数x:x={ a:9, //somethingElse:8//这将导致预期的编译错误 }; 常数y={ a:9, 大概是:8 }; 常数xx:X=y;//但这是有效的

为什么typescript类型分析的某些部分不一致? 接口X{ a:数字; } 常数x:x={ a:9, //somethingElse:8//这将导致预期的编译错误 }; 常数y={ a:9, 大概是:8 }; 常数xx:X=y;//但这是有效的,typescript,Typescript,但是,我期望与第一个赋值相同的行为,由于额外的属性而导致编译错误。我理解的基本原理是: 分配对象时的强限制 直接定义x:x时,不应访问附加属性somethingElse,这似乎是将其键入x时的意图 一直以来,代码的其余部分x始终是x类型,并且它不会公开somethingElse,因此,对于编译器来说,这里的代码(或开发人员)是不一致的 从其他变量赋值时限制较少 当您使用y分配其他变量xx时,y没有显式键入,因此属性somethingElse仍可以在其他位置使用 对于编译器,您似乎暂时将y限制为与

但是,我期望与第一个赋值相同的行为,由于额外的属性而导致编译错误。

我理解的基本原理是:

分配对象时的强限制 直接定义
x:x
时,不应访问附加属性
somethingElse
,这似乎是将其键入
x
时的意图

一直以来,代码的其余部分
x
始终是
x
类型,并且它不会公开
somethingElse
,因此,对于编译器来说,这里的代码(或开发人员)是不一致的

从其他变量赋值时限制较少 当您使用
y
分配其他变量
xx
时,
y
没有显式键入,因此属性
somethingElse
仍可以在其他位置使用


对于编译器,您似乎暂时将
y
限制为与接口
X
匹配的部分,这很好。在一个更复杂的示例中,可能有许多不同的对象适合此角色,因此为
xx
键入特定的接口是完全合法的。

原因是额外的属性没有影响。它被忽略-在所有编译器都知道
xx
X
类型之后,它会阻止您使用
xx。有些东西也是
。如果您说
y
是显式的
X
,编译器不会让您这样做。但是,通过这种方式,编译器推断出
y
的类型,并让您将其分配给
xx
,因为它是
typeof y
行为的子集。不幸的是,似乎没有办法解决这个问题。显然,它被称为“精确类型”,但并没有在TS中实现。很遗憾,不能选择进行过多的属性检查,或者更好的是,它是默认的,但可以选择退出。与另一个建议相反,最糟糕的开发体验是这种不一致性,尤其是在使用泛型的过程中。它让我想到C++ +代码> const ,只能够分配一种方式是完全好的。对象文字的限制是按照预期的,没有开发者的不一致。至于变量赋值,这种“临时限制”有时可能是无意的。编译器不应该假设它。即使特别地键入
y:{a:number;somethingElse:number;}
,仍然有效,这是不一致的。我认为这里的“接口”思想与其他编程语言非常相似。在某些情况下,您有不同的复杂对象,程序中的一段代码可以接受这些对象中的任何一个,因为它们公开了执行作业所需的公共方法/属性。就个人而言,当我看到一个用接口键入的参数时,我希望我可以传递任何复杂的对象,只要它满足“接口契约”。我怀疑这就是TypeScript的哲学。当然,它确实看起来不一致,与您在问题中暴露的观点不一致(请参阅关于问题+github讨论的其他评论)