基本类型:
number
:表示数字类型,包括整数和浮点数。string
:表示字符串类型。boolean
:表示布尔类型,只有两个可能的值:true
或 false
。null
和 undefined
:分别表示 null 值和 undefined 值。symbol
:表示唯一的、不可变的值,用作对象的属性。bigint
:表示任意精度的整数。字面量
:字面量类型是通过直接指定具体的字面量值来表示的类型。复合类型:
array
:表示数组类型,可以包含多个元素,每个元素可以具有相同或不同的类型。object
:表示对象类型,可以包含多个属性和对应的值。tuple
:表示元组类型,是固定长度和固定类型的数组。enum
:表示枚举类型,定义一组命名常量。any
:表示任意类型,取消了类型检查。unknown
:表示未知类型,类似于 any
,但更加类型安全。void
:表示没有返回值的函数的返回类型。never
:表示永远不存在的值的类型,通常用于表示抛出异常或无法执行到的代码路径。其他类型:
union
:表示联合类型,一个值可以是多个类型之一。intersection
:表示交叉类型,一个值同时具有多个类型的属性。function
:表示函数类型,包括参数类型和返回值类型。class
:表示类类型,用于创建对象的蓝图。interface
:表示接口类型,用于描述对象的结构和属性。type
:表示自定义类型别名。readonly
:表示只读属性修饰符。Partial
:表示将类型 T
的所有属性设置为可选。Pick
:表示从类型 T
中选择指定属性 K
形成新的类型。Record
:表示将类型 T
的值与类型 K
的键关联形成新的类型。此外,还有许多高级类型和类型操作符,如映射类型、条件类型、infer 关键字等,用于更复杂的类型操作和推导。
let num: number = 10;
let str: string = "Hello";
let bool: boolean = true;
let n: null = null;
let u: undefined = undefined;
let sym: symbol = Symbol("key");
let big: bigint = BigInt(10);
let stringLiteral: "hello" = "hello";
let arr: number[] = [1, 2, 3];
let obj: object = { key: "value" };
let tuple: [number, string] = [1, "one"];
enum Color { Red, Green, Blue }
let c: Color = Color.Green;
let anyValue: any = 5;
let unknownValue: unknown = "unknown";
let voidFunc: () => void = () => { console.log("Void function"); };
let neverValue: never = (() => { throw new Error("Error"); })();
let union: string | number = "hello";
union = 10;
interface A { a: number }
interface B { b: string }
type Intersection = A & B;
let obj: Intersection = { a: 1, b: "two" };
function add(x: number, y: number): number {
return x + y;
}
let multiply: (x: number, y: number) => number;
multiply = (x, y) => x * y;
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
let person: Person = new Person("Alice");
interface Point {
x: number;
y: number;
}
let point: Point = { x: 1, y: 2 };
type PartialPoint = Partial<Point>;
let partialPoint: PartialPoint = { x: 1 };
type PickedPoint = Pick<Point, "x">;
let pickedPoint: PickedPoint = { x: 1 };
type RecordPoint = Record<string, number>;
let recordPoint: RecordPoint = { x: 1, y: 2 };
type MappedNumbers = { [K in "one" | "two"]: number };
let mappedNumbers: MappedNumbers = { one: 1, two: 2 };
type ReturnTypeFunc = () => string;
let returnTypeFunc: ReturnTypeFunc = () => "Hello";
类型安全性(Type Safety):TypeScript 强调类型安全性,通过类型检查在编译时捕获潜在的类型错误,避免在运行时出现类型相关的错误。这可以减少调试时间并提高代码质量。
静态类型(Static Typing):TypeScript 是静态类型语言,类型信息在编译时确定并保持不变。变量、函数参数、函数返回值等都需要声明类型,并且在编译过程中进行类型检查。
类型推断(Type Inference):TypeScript 具有类型推断功能,可以根据变量的赋值推断出其类型,从而减少手动的类型注解。这使得代码编写更加简洁和灵活,同时仍保持类型安全。
结构类型化(Structural Typing):TypeScript 的类型系统是基于结构类型化(structural typing),而不是基于名义类型(nominal typing)。这意味着类型是根据其结构而不是名称进行比较。只要两个类型的结构相似,它们就被视为兼容的类型。
泛型(Generics):TypeScript 支持泛型编程,允许在函数、类和接口中使用类型参数。这样可以编写更通用和可复用的代码,使代码更加灵活和类型安全。
类型别名(Type Aliases):TypeScript 允许创建类型别名,通过给类型赋予一个新名称来简化复杂类型的表示。类型别名可以提高代码的可读性和可维护性。
联合类型和交叉类型(Union Types and Intersection Types):TypeScript 提供了联合类型(Union Types)和交叉类型(Intersection Types)的支持。联合类型表示一个值可以是多个类型之一,而交叉类型表示一个值同时具有多个类型的属性。
类型保护(Type Guards):TypeScript 提供了类型保护的机制,通过一些语法和模式来缩小变量的类型范围,从而在特定的代码块中获取更具体的类型。这可以提高代码的可读性和类型安全性。
可选类型和默认值(Optional Types and Default Values):TypeScript 允许将属性或函数参数标记为可选的,并提供默认值。这使得在使用对象或函数时可以选择性地省略某些属性或参数。
类型注解和类型断言(Type Annotations and Type Assertions):TypeScript 允许开发者使用类型注解显式地为变量、函数参数等添加类型信息。同时,还可以使用类型断言来告诉编译器某个值的具体类型,以便在需要时进行编译时类型检查。
在 TypeScript 中,有多种创建数组类型的写法。下面是一些常见的数组类型的创建写法:
let arr: number[] = [1, 2, 3]; // 数字数组
let strArr: string[] = ["hello", "world"]; // 字符串数组
let boolArr: boolean[] = [true, false]; // 布尔数组
let arr: Array<number> = [1, 2, 3]; // 数字数组
let strArr: Array<string> = ["hello", "world"]; // 字符串数组
let boolArr: Array<boolean> = [true, false]; // 布尔数组
let tuple: [number, string, boolean] = [1, "hello", true];
type NumberArray = number[];
let arr: NumberArray = [1, 2, 3]; // 数字数组
type StringArray = Array<string>;
let strArr: StringArray = ["hello", "world"]; // 字符串数组