TypeScript 之基础类型

picture

介绍

为了让程序更有价值,我们需要能够处理最简单的数据单元:数字、字符串、结构体、布尔值等。TypeScript支持与JavaScript几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用。


布尔值

最基本的数据类型就是简单的 true/ false 值,在 JavaScriptTypeScript 里叫做 boolean

let isDone: boolean = false;

数字

JavaScript 一样,TypeScript 里的所有数字都是浮点数,这些浮点数的类型是 number。除了支持十进制和十六进制字面量,TypeScript 还支持 ECMAScript2015 中引入的二进制和八进制字面量。

let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;

字符串

Javascript 程序的另一项基本操作是处理网页或服务端的文本数据。像其他语言里一样,我们使用 string 表示文本数据类型。和Javascript 一样,可以使用双引号(")或单引号(')表示字符串。

let name: string = 'bob';
name = 'smith';

你还可以使用模版字符串,它可以定义多行文本和内嵌表达式。 这种字符串是被反引号包围(```````),并且以${ expr }这种形式嵌入表达式。

let name: string = `GENE`;
let age: number = 37;
let sentence: string = `Hello,My name is ${name},I will be ${age + 1} years old next month`;

这与下面定义 sentence 的方式效果相同。

let sentence: string = 'Hello,My name is' + name + ',I will be' + (age + 1) + ' years old next month';

数组

TypeScriptJavaScript 一样可以操作数组元素。 有两种方式可以定义数组。 第一种,可以在元素类型后面接上 [],表示由此类型元素组成的一个数组:

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

第二种方式是使用数组泛型。

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

元组 Tuple

元组类型允许表示一个已知元素数量和元素类型的数组,各元素的类型不必相同。比如你可以定义一对值分别为 stringnumber 类型的元组。

// Declare a tuple type
let x: [string,  number];
// Initialize x
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error

当访问一个已知索引的元素,会得到正确的类型:

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' 都有 totoString

x[6] = true; // Error, 布尔不是(string | number) 类型

联合类型是高级主题,我们会在以后的章节里同讨论它。

枚举

enum 类型是对 JavaScript 标准数据类型的一个补充。像 C# 等其他语言一样,使用枚举类型可以为一组数值赋予美好的友好的名字。

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;

枚举类型提供的一个便利是你可以由枚举的值得到它的名字。例如,我们知道数值为 2,但是不知道它映射到 Color 里的那个名字,我们可以查找相应的名字。

enum Color {Red = 1, Green, Blue};
let colorName: string = Color[2];
console.log(colorName); // 显示 Green 因为上面代码里,它的值是2

Any

有时候,我们想要为那些在编程阶段还不清楚类型的变量指定一个类型。这些值可能来自于动态的内容,比如来自用户输入的第三方代码库。这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。那么我们可以使用 any 类型来标记这些变量:

let notSure: any = 4;
notSure = 'maybe a string instead';
notSure = false; // okay, definitely a boolean

在对现有代码进行改写的时候,就像它在其他语言中那样,它允许你在编译时可选择的包含或移除类型检查。你可能认为 Object 有相似的作用,就像它在其他语言中那样。但是 Object 类型的变量只是允许你给它赋任意值,但是却不能够在它上面调用任意的方法,即便它真有这样的方法:

let nouSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler does not check)

let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on the type 'Object'.

当你只知道一部分数据的类型时, any 类型也是有用的。比如,你有一个数组,它包含了不同的类型的数据:

let list: any[] = [1, true, 'free'];

list[1] = 100;

Void

某种程度上来说, void 类型像是与 any 类型相反,它表示没有任何类型。当一个函数没有返回值时,你通常会见到其返回值类型是 void

function warnUser(): void {
  console.log('This is my warning message');
}

声明一个 void 类型的变量没有什么大用,因为你只能赋予它 undefinednull

let unusable: void = undefined;

Null 和 Undefined

TypeScript 里, undefinednull 两者各自有自己的类型分别叫做 undefinednull 。和 void 相似,它们的本身的类型用处不是很大:

// 我们可以为这些变量分配的东西不多!
let u: undefined = undefined;
let n: null = nill;

默认情况下 nullundefined 是所有类型的子类型。也就是说你可以把 nullundefined 赋值给 number 类型的变量。

然而,当你指定了一个 --strickNullChecks 标记, nullundefined 只能赋值给 void 和它们自个。这能避免很多常见的问题。也许在某处传入一个 stringnullundefined ,你可以使用联合类型 string | null | undefined 。再次说明,后面会介绍联合类型。

注意:我们鼓励尽可能的使用 --strickNullChecks ,但在本介绍手册中我们假设这个标记是关闭的。

Never

never 类型表示的是那些永不存在的值的类型。例如,never 类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型;变量也可能是 never 类型,当它们被永不为真的类型保护约束时。

never 类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是 never 的子类型可以赋值给 never 类型(除了 never 本身除外)。即便 any 也不可以赋值给 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

object 表示非原始类型,也就是除了 numberstringbooleansymbolnullundefined 之外的类型。

使用 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 更了解某个值的详细信息。通常这会发生在你清楚的知道一个实体具有比它有类型更确切的类型。

通常类型断言这种方式可以告诉编译器:'相信我,我知道自己在干什么'。类型断言好比其他语言里的类型转换,但是不进行特殊的类型检查和重构。它没有运行时的影响,只是在编译阶段起作用。 TypeScript 会假设你,程序员,已经进行了必须的检查。

类型断言有两种形式。其一是 "尖括号" <> 语法:

let someValue: any = 'This is a string';

let strLength: number = (<string>someValue).length

另一个为 as 语法:

let someValue: any = 'This is a string';

let strLength: number = (someValue as string).length

两种形式是等价的。至于使用哪个大多数情况下是凭个人喜好。然而,当你在 TypeScript 里使用 JSX 时,只有 as 语法断言是被允许的。

关于 let

你可能已经注意到了,我们使用 let 关键字来替代大家所熟悉的 JavaScript 关键字 varlet 关键字是 JavaScript 的一个新概念, TypeScript 实现了它。很多常见的问题都可以通过使用 let 来解决,所以尽可能的使用 let 来替代 var 吧。


本文参考来源: TypeScript 基础类型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339