为什么可以将 'any' 分配给任何类型而不先显式转换它?
Why can 'any' be assigned to any type without explicitly casting it first?
为什么以下代码片段没有引发任何错误或警告?
{
let x: number;
let y: any;
y = "hello";
x = y;
}
我的期望是:任何东西都应该分配给 y
,因为它被明确键入为 any
,但是只有数字应该被分配给 x
,因为它被明确键入为 number
并且如果需要将 any
分配给 x
则应将其显式转换为 number
:
x = y as number;
当前的行为如何被认为是可以接受的或一个好主意,而不是首先是错误?此外,有没有办法强制编译器对此提出问题并只接受显式转换?
Extra Info:
tsc
version: 3.2.2
- compiler options:
{
"target": "ES5",
"noImplicitAny": true,
"strictNullChecks": true,
"downlevelIteration": true,
"experimentalDecorators": true,
"strictBindCallApply": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true
}
这是 any
的定义行为。此类型为同一类型:
- 可从任何其他类型分配
- 可分配给任何其他类型(您突出显示的问题)
- 允许使用它进行任何操作(索引、调用、属性 访问、操作员应用程序,所有这些都允许并且不以任何方式检查)
any
有多种用途。几个例子:
- 允许从 js 轻松过渡到 ts。当您将代码转换为打字稿时,
any
非常有用,可以让您在转换过程中成功编译代码。
- 允许与现有的 JS 代码轻松互操作(只需键入
any
,您就可以像在 JS 中一样使用它)。虽然您可能最好在长 运行 中编写定义。
综上所述,我今天会不惜一切代价避免使用 Typescript。 Typescript 3.0
引入了 unknown
类型,它的行为与您期望 any
的行为一样(即,您可以为其分配任何内容,但不能将其分配给任何其他类型)。阅读更多关于 unknown
摆脱自己的几个选择any
:
noImplictAny
编译器设置阻止编译器推断 any
如果你没有指定类型(它会发出错误)
no-unsafe-any
tslint 规则,防止以动态方式使用 any
,即只有在适用于 {} | 时才允许使用空 |未定义
no-any
tslint 规则,防止 any
的所有使用
为什么以下代码片段没有引发任何错误或警告?
{
let x: number;
let y: any;
y = "hello";
x = y;
}
我的期望是:任何东西都应该分配给 y
,因为它被明确键入为 any
,但是只有数字应该被分配给 x
,因为它被明确键入为 number
并且如果需要将 any
分配给 x
则应将其显式转换为 number
:
x = y as number;
当前的行为如何被认为是可以接受的或一个好主意,而不是首先是错误?此外,有没有办法强制编译器对此提出问题并只接受显式转换?
Extra Info:
tsc
version:3.2.2
- compiler options:
{ "target": "ES5", "noImplicitAny": true, "strictNullChecks": true, "downlevelIteration": true, "experimentalDecorators": true, "strictBindCallApply": true, "strictFunctionTypes": true, "strictPropertyInitialization": true }
这是 any
的定义行为。此类型为同一类型:
- 可从任何其他类型分配
- 可分配给任何其他类型(您突出显示的问题)
- 允许使用它进行任何操作(索引、调用、属性 访问、操作员应用程序,所有这些都允许并且不以任何方式检查)
any
有多种用途。几个例子:
- 允许从 js 轻松过渡到 ts。当您将代码转换为打字稿时,
any
非常有用,可以让您在转换过程中成功编译代码。 - 允许与现有的 JS 代码轻松互操作(只需键入
any
,您就可以像在 JS 中一样使用它)。虽然您可能最好在长 运行 中编写定义。
综上所述,我今天会不惜一切代价避免使用 Typescript。 Typescript 3.0
引入了 unknown
类型,它的行为与您期望 any
的行为一样(即,您可以为其分配任何内容,但不能将其分配给任何其他类型)。阅读更多关于 unknown
摆脱自己的几个选择any
:
noImplictAny
编译器设置阻止编译器推断any
如果你没有指定类型(它会发出错误)no-unsafe-any
tslint 规则,防止以动态方式使用any
,即只有在适用于 {} | 时才允许使用空 |未定义no-any
tslint 规则,防止any
的所有使用