any 和 any[ ] 有什么区别?
What is the difference between any and any[ ]?
any 和 any[ ] 有什么区别?
示例 1(按预期工作)
name1: any;
name2: any[];
this.name1 = this.name2;
示例 2(这也按预期工作)
name1: any;
name2: any[];
this.name2 = this.name1;
Why typescript allowing any
data type can be access any[]
data type. As same as any[]
data type can be access any
type of data? and Which one is best to use? And If the data type is just an object (not an array) like string or number or object or any
, then why any[ ]
will be accept that object type without showing any run-time or compile-time error?.
如果您在赋值的左侧和右侧都使用 any
,您基本上是在告诉 Typescript 不使用类型检查。
在左侧的 any
表示您要赋值的变量可以接受任何类型,因此它接受任何类型,包括 any[]
.[=16 类型的对象=]
如果类型 any
在右侧而你的类型 myVar: any[]
在左侧,你基本上是在告诉 Typescript 不使用类型检查。考虑到 运行 时不应用类型检查,你最终会 myVar
被赋值右侧的任何内容填充。
如果我们看一下这段 TypeScript 代码:
let name1: any = "John";
let name2: any[] = ["Mary", "Sue", "Sally"];
name1 = name2;
let name3: any[] = ["Luke", "Paul", "Ringo"];
let name4: any = "Mark";
name3 = name4;
它编译成的Javascript是:
var name1 = "John";
var name2 = ["Mary", "Sue", "Sally"];
name1 = name2;
var name3 = ["Luke", "Paul", "Ringo"];
var name4 = "Mark";
name3 = name4;
JavaScript 变量是动态的,没有集合类型。我可以想象这个 可以 被 TypeScript 编译器报告为警告或错误,但这不会停止 JavaScript 的生成或阻止 JavaScript来自 运行ning.
因此,虽然 any
/any[]
赋值没有当前编译错误或警告,但 any[]
仍可用于告知开发人员预期。
注意:这不是我会编写的代码,也不会建议任何人使用。这只是带有值的 OPs 代码,并显示了结果 JavaScript 的内容,并且因为它编译为 JavaScript,所以不会有 运行-time 由于类型而导致的错误,因为变量有动态类型。这也是我们选择使用 TypeScript 的原因之一:编译时静态类型检查。出于这个原因,人们通常会避免使用 any
和 any[]
,而选择 class 或能更好地表示数据的接口。在这种情况下,string
与 string[]
(或任何其他类型) 将 显示编译器错误。
在此示例中,name1 = name2
和 name3 = name4
都是编译时错误,因为变量从赋值中推断出类型,并且在后续代码中对它们的用法进行了类型检查。
let name1 = "John";
let name2 = ["Mary", "Sue", "Sally"];
name1 = name2; //Type 'string[]' is not assignable to type 'string'.
let name3 = ["Luke", "Paul", "Ringo"];
let name4 = "Mark";
name3 = name4; //Type 'string' is not assignable to type 'string[]'.
any 和 any[] 的区别在于智能。
var a:any = .....
a.map , a.join (no intellisense, typescript does not know if a is an array or not)
var a:any[] = ....
a.map , a.join (typescript knows that a is an array and will provide intellisence)
编译时错误
var aa:any[] = "a"; // error typescript will not allow this
var a:any = "a"; // a can be string, there is no harm
aa = a; // typescript cannot detect error at
// compile time because a can be array
var someString:string;
aa = someString; // typescript knows that aa is an array and someString is not
通过声明某些东西 any[]
,你是在告诉我希望这个对象是一个数组类型。但是,any 实际上是任何东西,甚至数组也可以是 any
,因此 typescript 允许您将 any 分配给任何数组。
TypeScript 会尽可能检测编译时错误,但当您将某些内容设置为 any 时,它不会检测编译时错误。
是否强制执行此类编译时错误取决于编译器设计者,我想不应该允许以下内容,
a:any
aa:any[] = a; // this should be compile time error
为了避免,当然可以将其转换为 aa = a as any[]
,就像 C# 和 Java.
等语言一样
运行时错误
Java脚本没有声明变量的类型规范,所以Java脚本引擎不知道类型。
只有当你调用一个方法或访问属性时,JavaScrip才会给你一个错误..
a:any[] ..
// this will give an error TypeError: .map is not a function
a.map( ()=> ... )
a.length // this is undefined.. any member of any object is
// essentially undefined, there is no type error when you access
// member
- 仅 Any 用于任何类型的单个对象。
- Any[] 用于 Any 类型的对象数组。
any 和 any[ ] 有什么区别?
示例 1(按预期工作)
name1: any;
name2: any[];
this.name1 = this.name2;
示例 2(这也按预期工作)
name1: any;
name2: any[];
this.name2 = this.name1;
Why typescript allowing
any
data type can be accessany[]
data type. As same asany[]
data type can be accessany
type of data? and Which one is best to use? And If the data type is just an object (not an array) likestring or number or object or any
, then whyany[ ]
will be accept that object type without showing any run-time or compile-time error?.
如果您在赋值的左侧和右侧都使用 any
,您基本上是在告诉 Typescript 不使用类型检查。
在左侧的 any
表示您要赋值的变量可以接受任何类型,因此它接受任何类型,包括 any[]
.[=16 类型的对象=]
如果类型 any
在右侧而你的类型 myVar: any[]
在左侧,你基本上是在告诉 Typescript 不使用类型检查。考虑到 运行 时不应用类型检查,你最终会 myVar
被赋值右侧的任何内容填充。
如果我们看一下这段 TypeScript 代码:
let name1: any = "John";
let name2: any[] = ["Mary", "Sue", "Sally"];
name1 = name2;
let name3: any[] = ["Luke", "Paul", "Ringo"];
let name4: any = "Mark";
name3 = name4;
它编译成的Javascript是:
var name1 = "John";
var name2 = ["Mary", "Sue", "Sally"];
name1 = name2;
var name3 = ["Luke", "Paul", "Ringo"];
var name4 = "Mark";
name3 = name4;
JavaScript 变量是动态的,没有集合类型。我可以想象这个 可以 被 TypeScript 编译器报告为警告或错误,但这不会停止 JavaScript 的生成或阻止 JavaScript来自 运行ning.
因此,虽然 any
/any[]
赋值没有当前编译错误或警告,但 any[]
仍可用于告知开发人员预期。
注意:这不是我会编写的代码,也不会建议任何人使用。这只是带有值的 OPs 代码,并显示了结果 JavaScript 的内容,并且因为它编译为 JavaScript,所以不会有 运行-time 由于类型而导致的错误,因为变量有动态类型。这也是我们选择使用 TypeScript 的原因之一:编译时静态类型检查。出于这个原因,人们通常会避免使用 any
和 any[]
,而选择 class 或能更好地表示数据的接口。在这种情况下,string
与 string[]
(或任何其他类型) 将 显示编译器错误。
在此示例中,name1 = name2
和 name3 = name4
都是编译时错误,因为变量从赋值中推断出类型,并且在后续代码中对它们的用法进行了类型检查。
let name1 = "John";
let name2 = ["Mary", "Sue", "Sally"];
name1 = name2; //Type 'string[]' is not assignable to type 'string'.
let name3 = ["Luke", "Paul", "Ringo"];
let name4 = "Mark";
name3 = name4; //Type 'string' is not assignable to type 'string[]'.
any 和 any[] 的区别在于智能。
var a:any = .....
a.map , a.join (no intellisense, typescript does not know if a is an array or not)
var a:any[] = ....
a.map , a.join (typescript knows that a is an array and will provide intellisence)
编译时错误
var aa:any[] = "a"; // error typescript will not allow this
var a:any = "a"; // a can be string, there is no harm
aa = a; // typescript cannot detect error at
// compile time because a can be array
var someString:string;
aa = someString; // typescript knows that aa is an array and someString is not
通过声明某些东西 any[]
,你是在告诉我希望这个对象是一个数组类型。但是,any 实际上是任何东西,甚至数组也可以是 any
,因此 typescript 允许您将 any 分配给任何数组。
TypeScript 会尽可能检测编译时错误,但当您将某些内容设置为 any 时,它不会检测编译时错误。
是否强制执行此类编译时错误取决于编译器设计者,我想不应该允许以下内容,
a:any
aa:any[] = a; // this should be compile time error
为了避免,当然可以将其转换为 aa = a as any[]
,就像 C# 和 Java.
运行时错误
Java脚本没有声明变量的类型规范,所以Java脚本引擎不知道类型。
只有当你调用一个方法或访问属性时,JavaScrip才会给你一个错误..
a:any[] ..
// this will give an error TypeError: .map is not a function
a.map( ()=> ... )
a.length // this is undefined.. any member of any object is
// essentially undefined, there is no type error when you access
// member
- 仅 Any 用于任何类型的单个对象。
- Any[] 用于 Any 类型的对象数组。