justsink
justsink
发布于 3周前

TypeScript:基本类型详解

布尔值(Boolean)

TypeScript的布尔值和JavaScript一样有两个值:true和false。

类型标识:boolean

示例:

let isDone: boolean = false;

数字(Number)

和JavaScript一样,TypeScript的所有数字都是用浮点数表示,支持二进制,八进制,十进制以及十六进制的表示方式,

类型标识:number。

示例:

let decimal: number = 6;      //十进制
let hex: number = 0xf00d;     //十六进制,以0x开头,0x后面数值为十六进制
let binary: number = 0b1010;  //二进制,以0b开头,0b后面数值为二进制
let octal: number = 0o744;    //八进制,以0o开头,0o后面为八进制

字符串(String)

TypeScript字符串是使用双引号或单引号括起来的文本。

类型标识:string

示例:

let color: string = "blue";
color = 'red';

字符串拼接

使用加号(+)拼接多个字符串以及变量。

let hello: string = "Hello";
let helloWorld: string = hello + ",World!";

模板字符串

在TypeScript,字符串除了使用双引号或单引号括起来这种常见的表示形式外,还可以使用反引号(`)括起来。使用反引号括起来的字符串称为模板字符串(template string)。

使用双引号或单引号括起来的字符串只能使用单行表示,而模板字符串可以在反引号内使用多行表示,及嵌入表达式。表达式形式为${expr}。

示例:

let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ fullName }.

I'll be ${ age + 1 } years old next month.`;

等同于字符串拼接

let sentence: string = "Hello, my name is " + fullName + ".\n\n" +
    "I'll be " + (age + 1) + " years old next month.";

显然,模板字符串避免了字符串拼接的不便。

数组(Array)

数组有两种表示形式:类型[]和泛型Array<类型>,其中这里的类型为数组的元素类型。

类型[]

let list: number[] = [1, 2, 3];

Array<类型>

let list: Array<number> = [1, 2, 3];

元组(Tuple)

数组(Array)要求元素类型必须一样,而元组类似数组,和数组不一样的地方是,元组里元素类型可以不一样。

表示形式:[类型1,类型2,类型3...],其中类型n表示元组里此位置的元素类型。

示例:

//元组
let x: [string, number];
//初始元组,要求值的类型需要和声明的类型一致
x = ["hello", 10]; 
// 错误的初始化
x = [10, "hello"]; // Error

用下标来使用元组元素,下标索引从0开始:

let s1 = x[0];  //引用
x[1] = 100;     //赋值

枚举(Enum)

枚举表示一个数据类型集。

类型标识:enum,

表示方式: enum 枚举名{枚举值1,枚举值2...}

示例:

enum Color {Red, Green, Blue}
let c: Color = Color.Green;

TypeScript会给每个枚举值内置一个计数,计数默认从0开始,即上面例子的Color枚举,Red计数为0,Green为1,Blue为2。支持自定义计数的初始值。

从1开始计算数


enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;

自定义计数值

enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;

每个枚举值对应一个计数,TypeScript支持使用下标[]来获取枚举值,其中,下标里的数字为枚举值对应的计数。

enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];

alert(colorName);

Any

声明为any的值是可以被赋予任何类型的数据,编译器不会对any类型的值做检查,也不会检查它的属性和方法。这是有区别与声明为Object的值。

类型标识:any

示例:

let notSure: any = 4;    //number类型
notSure = "maybe a string instead";  //也可以被赋值为string类型
notSure = false; // 也可以被赋值为boolean类型

方法的检查

let notSure: any = 4;
notSure.ifItExists(); // 编译器不做检查
notSure.toFixed(); // 编译器不做检查

let prettySure: Object = 4;
prettySure.toFixed(); // 编译出错,因为Object类不存在toFiexd()方法

Void

void类型刚好与any类型相对,表示缺失类型,它用在方法或函数没有返回值的情况。

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

Null and Undefined

TypeScript里值为null和undefined对应的类型也分别是null和undefined。直接声明变量为null或者undefined没有实际意义。

默认情况下,null和undefined是所有类型的子类型,它们可以被赋值给任何类型。


let n: number= null;

可以开启--strictNullChecks选项,这样null和undefined只能被赋值给void类型,不能赋值给其他类型。

Never

never为TypeScript2.0新增的原始类型,它表示那些从不出现的值的类型。它可以是总是抛出异常的函数表达式或箭头函数表达式返回的类型,也可以是永远不返回值得返回类型。

类型标识:never

never是任何类型的子类型,可以赋值给任何类型,但它没有子类型,除了可以赋值为never外,不能被赋值为任何类型。

示例:


// Function returning never must have unreachable end point
function error(message: string): never {
    throw new Error(message);
}

// Inferred return type is never
function fail() {
    return error("Something failed");
}

// Function returning never must have unreachable end point
function infiniteLoop(): never {
    while (true) {
    }
}

参考及示例来源:Basic Types