Skip to main content

Type Annotation

类型化定义

静态语言变量在定义时要确定某种类型才能正确的在内存中分配相应类型的空间。TypeScript并不是真正意义上的静态语言,其类型定义并不是为了在内存中分配相应数据类型的空间,而是为了编译成JavaScript代码之前进行静态类型检查。

类型注解

通过类型注解,可以告诉TypeScript变量或函数的预期类型。这样,在编译时,TypeScript编译器会根据类型注解进行验证,确保在代码中使用的值与注解的类型相符。

TypeScript中,类型注解通常有三种:

  1. 显式类型。
  2. 类型推断。
  3. 隐式any

显式类型

手动指定变量的类型,基础语法为varName: Type = xxx

let a : number = 1;

// Type 'string' is not assignable to type 'number'.
a = 'abc'

let b: number;

b = 2

let str: string = 'abcd';
let bool: boolean = true

类型推断

通过赋值让TypeScript对变量进行类型推断,而无需显式指定。通常情况下,TypeScript会根据其上下文环境对类型进行推断,在使用中尽可能的借助这中特性。

// let a: number
let a = 1;

// item => number
[1, 2, 3].map((item) => item + 1)

隐式any

如果没有定义类型,且无法进行类型推断,且非严格模式,那么隐式注解为any

通常情况相下,应尽可能的避免使用any,如果没有开启严格模式,使用any意味着退回到了JavaScript的编程模式,失去了使用TypeScript的意义。详情请查看

// "strict": true,
// "noImplicitAny": true

// let a: any
let a;
a = 1

设计思想

  1. 什么TypeScript没有像Java一样的charString类型?

TypeScript的类型是为了做静态类型检查用的,而不是为了在内存中开辟相应数据类型空间用的。TypeScript代码最终都要编译成JavaScript代码,开辟内存这件事最终是由JavaScript引擎来完成。所以TypeScript的基本数据类型沿用了JavaScript中typeof的返回值。

  1. 为什么TypeScript没有像Java一样的整型与浮点型 ?

Java的整型与浮点型是为了静态类型检查与分配相应的内存空间。在TypeScript中,设计整型、浮点型只能做静态类型检查,而JavaScript中,并没有对其进行类型划分。根据JavaScript的业务场景来说,对整型与浮点型的区分并没有相应的要求,因此TypeScript没有必要针对数字类型进行再划分。

  1. 为什么TypeScript的基本数据类型定义都是小写 ?

TypeScript的基本类型定义都是直接沿用JavaScript中typeof返回的数据类型写法,TypeScript中也可以定义StringNumberBoolean,只是意义不同而已。

let str: string = 'abc';
let strObj: String = new String('abc')

// Type 'String' is not assignable to type 'string'.
str = strObj
  1. 什么时候使用显式类型定义 ?什么时候用类型推断 ?

类型推断是省略显式类型定义的方式,不需要显式定义类型,也会得出正确的类型。如果你有在代码层面明确类型展示的目的,那么可以考虑使用显式类型定义。但在一般情况下,TypeScript可以进行明确的类型推断,就不再需要进行显式类型定义了,尤其是在变量定义与初始化的时候。