
上QQ阅读APP看书,第一时间看更新
1.3.1 动态类型和静态类型
JavaScript是动态类型的,TypeScript是静态类型的。事实上,创建TypeScript就是为了在JavaScript中添加静态类型检查。将运行时错误转换成编译时错误,能够使代码更容易维护、适应性更强,对于大型应用程序,尤其如此。本书关注静态类型和静态类型语言,但是对动态类型语言有所了解会有帮助。
动态类型不会在编译时施加任何类型约束。日常交流中有时会将动态类型叫作“鸭子类型”(duck typing),这个名称来自俗语:“如果一种动物走起来像鸭子,叫起来像鸭子,那么它就是一只鸭子。”代码可按照需要自由使用一个变量,运行时将对变量应用类型。在TypeScript中,通过使用any关键字可模拟动态类型,因为any关键字允许未指定类型的变量。
我们可以实现一个quacker()函数,使其接受一个any类型的duck实参,并调用该实参的quack()方法。只要我们向该函数传递一个有quack()方法的对象,代码就可以工作。但是,如果传入一个没有quack()方法的参数,就会发生运行时TypeError,如程序清单1.13所示。
程序清单1.13 动态类型

另外,静态类型在编译时执行类型检查,所以试图传入错误类型的实参会导致编译错误。为了利用TypeScript的静态类型特性,我们可以更新代码,声明一个Duck接口,并正确设置函数实参的类型,如程序清单1.14所示。注意,在TypeScript中,我们不需要显式声明要实现Duck接口,只要提供quack()函数,编译器就会认为实现了该接口。使用其他语言时,我们必须显式声明一个类实现了该接口。
程序清单1.14 静态类型

在编译时捕获这种类型的错误,而不让它们导致程序运行失败,是静态类型的主要优势。