任何和任何[]有什么区别?

时间:2017-05-19 11:48:29

标签: arrays angular typescript types any

任何和任何[]之间有什么区别?

示例1(按预期工作)

name1: any;
name2: any[];
this.name1 = this.name2;

示例2(这也按预期工作)

name1: any;
name2: any[];
this.name2 = this.name1;
  

为什么允许any数据类型的typecript可以访问any[]数据类型。与any[]数据类型相同,可以访问any类型的数据吗?和哪一个最好用?而且如果数据类型只是string or number or object or any之类的对象(不是数组),那么为什么any[ ]会接受对象类型没有显示任何运行时或编译时错误?

4 个答案:

答案 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的原因之一:编译时静态类型检查。出于这个原因,通常会避免anyany[]支持更好地表示数据的类或接口。在这种情况下,stringstring[](或任何其他类型)显示编译器错误。

在这个例子中,name1 = name2name3 = 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)

  1. only任何用于任何类型的单个对象。
  2. 任何[]用于类型为Any的对象数组。