说明
本笔记是对TypeScript中文网站内容的学习记录,记录一些重要的,容易忘记的知识点。文中的TypeScript简称(TS), JavaScript简称(JS)
JavaScript数据类型
- undefined(未定义),
- null(空),
- boolean(布尔型),
- string(字符串),
- symbol(符号),
- number(数字),
- object(对象)
TypeScript基础类型
JS支持的,TS基本都支持。而且还提供了 枚举类型,以及any等。枚举 和 any比较重要的。
枚举
enum Color {Red, 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];
alert(colorName);
跟其他语言的enum类似,使用方便灵活。
任意值 any、Object
JS中有Object, TS中有any
任意值背景
有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 那么我们可以使用 any类型来标记这些变量。
TS中的any
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
JS中的Object
let notSure: Object = 4;
notSure = "maybe a string instead";
console.log(notSure);
notSure = false;
console.log(notSure);
差异
Object 和 any都可以达到上述要求。官网上有段描述:
在对现有代码进行改写的时候,any
类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查。 你可能认为 Object有相似的作用,就像它在其它语言中那样。 但是 Object类型的变量只是允许你给它赋任意值 - 但是却不能够在它上面调用任意的方法,即便它真的有这些方法:
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
上述Object在TS中是无法编译通过的。
let listany: any[] = [1, true, "free"];
console.log(listany);
数组
定义数组, 2中方式
let list: number[] = [1,2,3]
let list: Array<number> = [1,2,3]
元组 Tuple
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为 string和number类型的元组。
// Declare a tuple typelet
x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error
问题
当访问一个越界的元素,会使用联合类型替代:
x[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型
console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString
x[6] = true; // Error, 布尔不是(string | number)类型
但是实操发现,执行
console.log(x[5].toString());
是不正确的,运行会提示 toString是undefined类型。修改为 x[3]是没有任何问题的, 所以这里存在疑问。
空值 void
Null and Undefined
// Not much else we can assign to these variables!
let u: undefined = undefined
;let n: null = null;
//Null / Undefinedlet
number1: number = null;
//let number1: number = undefined;
console.log(number1);
但是,编译的时候添加参数 --strictNullChecks
后,就不能编译通过了的,是个好东西。
never
类型断言
有时候你会遇到这样的情况,你会比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;
OMOP:个人觉得 as 使用 顺手, 并且,你要是使用JSX, 只有as语法断言是允许的。