基础数据类型
1、String
2、Number
3、数组
let list: number[] = [1,2,3]
let list: Array<number> = [1,2,3]
4、元组Tuple:
let x: [number, string];
x = [10, 'zhangsan']; //ok
x = ['zhangsan', 10]; //error
5、枚举 enum
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, Blue}
let colorName: string = Color[2];
console.log(colorName); // 显示'Green'因为上面代码里它的值是2
6、Any
7、Void: 当一个函数没有返回值时,其返回值类型是 void
声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null
let a: void = undefined
8、 undefined 和 null
9、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) {
}
}
10、Object
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
11、类型断言
当你清楚地知道一个实体具有比它现有类型更确切的类型。
类型断言有两种形式。 其一是“尖括号”语法:
let a: any = 'this is a value'
let length: number = (<string>a).length
另一个 as 语法:
let a: any = 'this is a value'
let length: number = (a as string).length
两种形式是等价的。 至于使用哪个大多数情况下是凭个人喜好;然而,当你在TypeScript里使用JSX时,只有 as语法断言是被允许的。
12、联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种,未赋值时联合类型上只能访问两个类型共有的属性和方法
let skin: string | number;
console.log(skin.toString());
skin = 1;
console.log(name.toFixed(2));
skin = "hello";
console.log(skin.length);
非空断言 在上下文中当类型检查器无法断定类型时 一个新的后缀表达式操作符 ! 可以用于断言操作对象是非 null 和非 undefined 类型
let flag: null | undefined | string;
flag!.toString(); // ok
flag.toString(); // error
13、类型别名
type skin = string | number;
function hello(value: skin) {
console.log("value:", value)
}
14、类型保护
类型保护就是一些表达式,他们在编译的时候就能通过类型信息确保某个作用域内变量的类型 其主要思想是尝试检测属性、方法或原型,以确定如何处理值
typeof 类型保护
function double(input: string | number | boolean) {
if (typeof input === "string") {
return input + input;
} else {
if (typeof input === "number") {
return input * 2;
} else {
return !input;
}
}
}
in 关键字
interface Car {
color: string;
}
interface Person {
age: string;
}
function getNumber(value: Car | Person) {
if ("color" in value) {
return value.color;
}
return value.age;
}
instanceof 类型保护
class Person {
name!: string;
}
class Teacher extends Person {
age!: number;
}
function getName(teacher: Teacher) {
if (teacher instanceof Teacher) {
console.log(teacher.age);
} else {
console.log(teacher.name);
}
}
自定义类型保护
通过 type is xxx这样的类型谓词来进行类型保护
例如下面的例子 value is object就会认为如果函数返回 true 那么定义的 value 就是 object 类型
function isObject(value: unknown): value is object {
return typeof value === "object" && value !== null;
}
function fn(x: string | object) {
if (isObject(x)) {
// ....
} else {
// .....
}
}
\