# TypeScript 类型

> 原文： [https://howtodoinjava.com/typescript/typescript-types/](https://howtodoinjava.com/typescript/typescript-types/)

TypeScript 支持对基本类型（原始类型和对象类型）进行类型检查。 它还支持泛型，装饰器和 ES6 模块类型。 重要的是要知道 TypeScript 中的类型系统设计为***可选***。 因此，所有 javascript 程序也都是 TypeScript 程序。

```java
Table of Contents

Static types
	- Primitive Types
	- Object Types
Generics
Decorators
```

## 1）静态类型

在语言语义和类型系统的上下文中，**静态类型通常表示“在编译时”**或“不运行程序”，而**动态表示“在运行时”**。 在静态类型语言中，变量，参数和对象成员具有编译器在编译时就知道的类型。 编译器可以使用该信息执行类型检查并优化编译的代码。

TypeScript 中的静态类型可以分为两个子类型：

#### 1.1）基本类型

TypeScript 具有 5 种主要基本类型，即`number`，`string`，`boolean`，`void`和`any`。

`number` 

用于定义类型为`number`的变量。

```java
				let num: number = 123;
				num = 123.456;
				num = '123'; 	// Error

```

`string` 

用于定义`string`类型的变量。

```java
				let str: string = 'hello';
				str = 'world';
				str = 123; 	// Error

```

`boolean` 

用于定义`boolean`类型的变量。

```java
				let bool: boolean = false;
				bool = true;
				bool = 123; 	// Error

```

`void`

1.  用于函数返回类型以表示非返回函数。

    ```java
    			function warnUser(): void {
    			    alert("This is my warning message");
    			}

    ```

2.  声明 `void` 类型的变量没有用，因为只能将 `undefined` 或 `null` 分配给它们。

    ```java
    			let tempVar: void = undefined;
    			tempVar = null;		

    			tempVar = 123;		//Error

    ```

`any`

当您想退出类型检查并让值通过编译时检查时，请使用`any`。

```java
				let val: any = 'hello';

				val = 123; 		// OK

				val = true; 	// OK

```

 |

#### 1.2）对象类型

TypeScript 支持以下对象类型。

数组

数组是**相同数据类型**的值的集合。

```java
			var names:string[];	//declaration 

			names = ["how","to","do","in","java"];	//initialization

```

元组

元组就像数组； 但存储“不同数据类型”的值。 就像数组一样，它也是基于索引的数据结构。

```java
			var items;	//declaration 

			items = ["how", 2, "do", 1 , true];	//initialization

```

接口

接口定义派生成员类必须实现的属性，方法和事件。

```java
			interface ICalc { 
				add (first: number, second: number): any;
			} 

			let Calculator: ICalc = {
				add(first: number, second: number) {
					return first + second;
				}
			}

```

类

类是用于创建对象的模板。 Typescript 从 ES6 获得对类的支持。

```java
			class Person { 

			   //field 
			   name:string; 

			   //constructor 
			   constructor(name:string) { 
			      this.name = name; 
			   }  

			   //function 
			   speakName():void { 
			      console.log("Name is  :   "+this.name) 
			   } 
			}

```

枚举

与其他编程语言一样，枚举是由一组命名值组成的数据类型。 名称通常是充当常量的标识符。 ES6 中引入了枚举。

```java
			enum Direction {
			    Up,
			    Down,
			    Left,
			    Right
			}

			let go: Direction;
			go = Direction.Up;

```

函数

在 TypeScript 中，我们可以声明仅在函数生命期内指向函数的变量。

```java
				let fun: Function = () => console.log("Hello");

				fun = 123; //Error

```


## 2）泛型

泛型允许创建一个可以在多种类型而不是单个类型上工作的组件。 例如：

```java
function throwBack<T>(arg: T): T {	//Function return the parameter as it is
    return arg;
}

let outputStr = identity<string>("myString"); 	//OK

let outputNum = identity<number>( 100 ); 		//OK

```

## 3）装饰器

一般而言，装饰器是注解。 它们与`'@'`符号一起使用。 它允许我们修饰类和函数，类似于 java 中的注解和 python 中的装饰器。

> 装饰器是一项新功能，很可能会纳入 JavaScript 的 ES7 版本。 但是该功能在 TypeScript（实验性）中可用，因此我们已经可以使用它了。

#### 如何使用装饰器

了解每个**装饰器都是 javascript 函数**，这一点很重要。 要创建装饰器，请创建如下函数：

```java
function printable ( target ) {
	Object.defineProperty(target.prototype, 'print', {value: () => "Lokesh Gupta"});
}

@printable
class Person {

}

let admin = new Person();
console.log(admin.print()); // Lokesh Gupta

```

TypeScript 中的**类型系统就这些了**。 将我的问题放在评论部分。

学习愉快！