name1: any;
name2: any[];
this.name1 = this.name2;
name1: any;
name2: any[];
this.name2 = this.name1;
为什么允许
any
数据类型的typecript可以访问any[]
数据类型。与any[]
数据类型相同,可以访问any
类型的数据吗?和哪一个最好用?而且如果数据类型只是string or number or object or any
之类的对象(不是数组),那么为什么any[ ]
会接受对象类型没有显示任何运行时或编译时错误?。
答案 0 :(得分:10)
如果我们查看此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运行。
因此,虽然any
/ any[]
分配没有当前的编译错误或警告,但any[]
仍可用于通知开发人员期望。
注意:这不是我写过的代码或建议任何人都会使用的代码。这只是带有值的OPs代码,并显示了由此产生的JavaScript,因为它编译为JavaScript,因为类型因为变量具有动态类型而不会出现运行时错误。这是我们选择使用TypeScript的原因之一:编译时静态类型检查。出于这个原因,通常会避免any
和any[]
支持更好地表示数据的类或接口。在这种情况下,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[]'.
答案 1 :(得分:6)
如果在作业的左侧和右侧都使用any
,则基本上可以对Typescript说不使用类型检查。
在any
左侧,表示您要分配的变量值可以接受任何类型,因此它接受包括any[]
类型的对象在内的任何内容。
如果类型any
位于右侧并且您在左侧有myVar: any[]
,则基本上可以说要使用Typescript而不使用类型检查。考虑到在运行时不应用类型检查,最终会使myVar
填充在作业右侧的任何内容。
答案 2 :(得分:1)
任何和任何[]之间的区别在于Intellisence。
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
因此,typescript允许你为任何数组赋值。
TypeScript会尽可能地检测编译时错误,但是当你设置任何错误时,它将不会检测编译时错误。
编译器设计者是否可以强制执行此类编译时错误,我想不应该允许以下内容,
a:any
aa:any[] = a; // this should be compile time error
为了避免,人们当然可以将其转换为aa = a as any[]
,与C#和Java等语言相同。
运行时错误
JavaScript没有变量声明的类型规范,因此JavaScript引擎对类型没有任何了解。
只有当您调用方法或访问属性时,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
答案 3 :(得分:1)