目录
前言
一、基本类型(I)
1、布尔类型
2、数字类型
3、字符串类型
4、数组类型
5、元组类型
6、枚举类型
二、基本类型(II)
1、任意类型
2、Void类型
3、Null 和 Undefined类型
4、Never类型
5、Object类型
三、类的断言
TypeScript 是一种强类型编程语言,它建立在 JavaScript 的基础上,可以在任何规模上提供更好的工具。TypeScript代码转换成 JavaScript,JavaScript 可以在 JavaScript 运行的任何地方运行: 在浏览器中,在 Node.js 或 Deno 上,在你的应用程序中。
在JavaScript和TypeScript里也是boolean,只有简单的true和false。
let isNot: boolean = false;
TypeScript里的所有数字都是浮点数,类型是number,与JavaScript也是一样的,有很多地方和JavaScript有异曲同工在之妙,接下来的文章将偶尔提及不同之处。
TypeScript支持二、八、十、十六进制的整数和分数。
let binaryLiteral: number = 0b1010; // 二进制
let octalLiteral: number = 0o744; // 八进制
let decLiteral: number = 6; // 十进制
let hexLiteral: number = 0xf00d; // 十六进制
TypeScript使用双引号(" ")或者单引号(' ')表示字符串string。
let name: string = "TypeScript";
name = "JavaScript";
还可以使用模版字符串,它可以定义多行文本和内嵌表达式。 这种字符串是被反引号包围( `
),并且以${ expr }
这种形式嵌入表达式。
let name: string = `Gene`;
let age: number = 37;
//第一种
let sentence: string = `Hello, my name is ${ name }.
I'll be ${ age + 1 } years old next month.`;
//第二种
let sentence: string = "Hello, my name is " + name + ".\n\n" +
"I'll be " + (age + 1) + " years old next month.";
有两种方式可以定义数组Array。
第一种,可以在元素类型后面接上 []
,表示由此类型元素组成的一个数组:
let list: number[] = [1, 2, 3];
第二种方式是使用数组泛型,Array<元素类型>
:
let list: Array = [1, 2, 3];
元组tuple类型允许表示一个已知元素数量和类型的数组,各个元素的类型可以不相同,对应位置的类型需要相同,比如你可以定义一对值分别为string和number的类型的元组。
let x: [string, number];
x = ['hello', 10]; // 运行正常
x = [10, 'hello']; // 运行报错
当访问一个已知索引的元素,会得到正确的类型:
console.log(x[0].substr(1)); // OK
console.log(x[1].substr(1)); // Error, 'number' does not have 'substr'
当访问一个越界的元素,会使用联合类型替代:
x[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型
console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString
x[6] = true; // Error, 布尔不是(string | number)类型
enum类型是对JavaScript标准数据类型的一个补充,使用它可以为一组数值赋予友好的名字。
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
默认情况下,从0开始为元素编号,你也可以手动的指定成员的数值。例如我们将上面的例子从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;
枚举类型提供的一个便利是你可以由枚举值得到它的名字,为我们查找提供方便:
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
console.log(colorName); // 显示'Green'因为上面代码里它的值是2
有些时候我们编程的时候还不确定指定什么类型,也许是一个动态的值,可变类型等等,这时候我们便出现了任意类型--any 用来标记这些变量。
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
对现有的代码改写的时候,any类型是十分有用的,他允许你在编译的时候可选择的包含或者移除类型检查。
Any与Object区别:Object类型的变量只允许你给它赋任意值,但是不能够在它上面调用任意的方法,即使它真的有这些方法:
let isAny: any = 4;
isAny.ifItExists(); // ok, ifItExists可能在运行时存在
isAny.toFixed(); // ok, toFixed存在(但编译器不检查)
let isObject: Object = 4;
isObject.toFixed(); // 错误:类型“Object”上不存在属性“toFixed”。
当你只知道一部分数据的类型时,any
类型也是有用的。 比如,你有一个数组,它包含了不同的类型的数据:
let list: any[] = [1, true, "free"];
list[1] = 100;
用于标识方法返回值的类型,表示该方法没有返回值。
function warnUser(): void {
console.log("This is my warning message");
}
声明一个void
类型的变量没有什么大用,因为你只能为它赋予undefined
和null
:
let unusable: void = undefined;
TypeScript中的这两种类型也没什么很大的用处,null表示对象值缺失,undefined用于初始化变量为一个未定义的值。
默认情况下,像 null 和 undefined 这样的值可以分配给任何其他类型。这样可以使编写代码更加容易,但是忘记处理 null 和未定义的代码会导致世界上无数的 bug ——有些人认为这是一个十亿美元的错误!Stricttnullchecks 标志使处理 null 和 undefined 变得更加明确,使我们不必担心是否忘记处理 null 和 undefined。
关闭 strictnullcheck 后,仍然可以正常访问可能为 null 或未定义的值,null 和未定义的值可以分配给任何类型的属性。这类似于没有空检查的语言(例如 c # 、 Java)的行为。缺乏对这些值的检查往往是 bug 的一个主要来源;
使用 strictNullChecks,当一个值为空或未定义时,您需要在对该值使用方法或属性之前测试这些值。就像在使用可选属性之前检查未定义的值一样,我们可以使用收缩来检查可能为 null 的值:
function doSomething(x: string | null) {
if (x === null) {
// do nothing
} else {
console.log("Hello, " + x.toUpperCase());
}
}
当我们知道值不能为空的时候,它就很重要了。
function liveDangerously(x?: number | null) {
// No error
console.log(x!.toFixed());
}
never类型表示的是那些永不存在的值的类型。例如,never类型是那些总是会抛出异常货根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型;变量也可能是never类型,当他们被永不为真的类型保护所约束时。
never类型任何类型的子类型,也可以赋值给任何类型;
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值类型为never
function fail() {
return error("Something failed");
}
// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {
}
}
object
表示非原始类型,也就是除number
,string
,boolean
,symbol
,null
或undefined
之外的类型。
使用object
类型,就可以更好的表示像Object.create
这样的API。例如:
declare function create(o: object | null): void;
create({ prop: 0 }); // OK
create(null); // OK
create(42); // Error
create("string"); // Error
create(false); // Error
create(undefined); // Error
类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。 TypeScript会假设你,程序员,已经进行了必须的检查。
类型断言有两种形式。 其一是“尖括号”语法:
let someValue: any = "this is a string";
let strLength: number = (someValue).length;
另一个为as语法:
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
两种形式是等价的。 至于使用哪个大多数情况下是凭个人喜好;然而,当你在TypeScript里使用JSX时,只有 as
语法断言是被允许的。