TS语言学习(二)
一、类型别名
TypeScript 提供了为类型注解设置别名的便捷语法,你可以使用 type SomeName = someValidTypeAnnotation 来创建别名,比如:
type Pet = 'cat' | 'dog'; let pet: Pet; pet = 'cat'; // Ok pet = 'dog'; // Ok pet = 'zebra'; // Compiler error
二、基础知识
为了让大家能更好地理解并掌握 TypeScript 内置类型别名,我们先来介绍一下相关的一些基础知识。
2.1 typeof
在 TypeScript 中, typeof 操作符可以用来获取一个变量声明或对象的类型。
interface Person { name: string; age: number; } const sem: Person = { name: 'semlinker', age: 30 }; type Sem= typeof sem; // -> Person function toArray(x: number): Array { return [x]; } type Func = typeof toArray; // -> (x: number) => number[]
2.2 keyof
keyof 操作符可以用来一个对象中的所有 key 值:
interface Person { name: string; age: number; } type K1 = keyof Person; // "name" | "age" type K2 = keyof Person[]; // "length" | "toString" | "pop" | "push" | "concat" | "join" type K3 = keyof { [x: string]: Person }; // string | number
2.3 in
in 用来遍历枚举类型:
type Keys = "a" | "b" | "c" type Obj = { [p in Keys]: any } // -> { a: any, b: any, c: any }
2.4 infer
在条件类型语句中,可以用 infer 声明一个类型变量并且对它进行使用。
type ReturnType = T extends ( ...args: any[] ) => infer R ? R : any;
以上代码中 infer R 就是声明一个变量来承载传入函数签名的返回值类型,简单说就是用它取到函数返回值的类型方便之后使用。
2.5 extends
有时候我们定义的泛型不想过于灵活或者说想继承某些类等,可以通过 extends 关键字添加泛型约束。
interface ILengthwise { length: number; } function loggingIdentity(arg: T): T { console.log(arg.length); return arg; }
现在这个泛型函数被定义了约束,因此它不再是适用于任意类型:
loggingIdentity(3); // Error, number doesn't have a .length property
这时我们需要传入符合约束类型的值,必须包含必须的属性:
loggingIdentity({length: 10, value: 3});
三、内置类型别名
3.1 Partial
Partial
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Make all properties in T optional */ type Partial = { [P in keyof T]?: T[P]; };
在以上代码中,首先通过 keyof T 拿到 T 的所有属性名,然后使用 in 进行遍历,将值赋给 P ,最后通过 T[P] 取得相应的属性值。中间的 ? ,用于将所有属性变为可选。
示例:
interface Todo { title: string; description: string; } function updateTodo(todo: Todo, fieldsToUpdate: Partial) { return { ...todo, ...fieldsToUpdate }; } const todo1 = { title: "organize desk", description: "clear clutter" }; const todo2 = updateTodo(todo1, { description: "throw out trash" });
3.2 Required
Required
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Make all properties in T required */ type Required = { [P in keyof T]-?: T[P]; };
以上代码中, -? 的作用就是移除可选项 ? 。
示例:
interface Props { a?: number; b?: string; } const obj: Props = { a: 5 }; // OK const obj2: Required = { a: 5 }; // Error: property 'b' missing
3.3 Readonly
Readonly
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Make all properties in T readonly */ type Readonly = { readonly [P in keyof T]: T[P]; };
如果将上面的 readonly 改成 -readonly , 就是移除子属性的 readonly 标识。
示例:
interface Todo { title: string; } const todo: Readonly = { title: "Delete inactive users" }; todo.title = "Hello"; // Error: cannot reassign a readonly property
Readonly
function freeze(obj: T): Readonly ;
3.4 Record
Record
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Construct a type with a set of properties K of type T */ type Record = { [P in K]: T; };
示例:
interface PageInfo { title: string; } type Page = "home" | "about" | "contact"; const x: Record = { about: { title: "about" }, contact: { title: "contact" }, home: { title: "home" } };
3.5 Pick
Pick
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * From T, pick a set of properties whose keys are in the union K */ type Pick = { [P in K]: T[P]; };
示例:
interface Todo { title: string; description: string; completed: boolean; } type TodoPreview = Pick; const todo: TodoPreview = { title: "Clean room", completed: false };
3.6 Exclude
Exclude
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Exclude from T those types that are assignable to U */ type Exclude = T extends U ? never : T;
如果 T 能赋值给 U 类型的话,那么就会返回 never 类型,否则返回 T 类型。最终实现的效果就是将 T 中某些属于 U 的类型移除掉。
示例:
type T0 = Exclude<"a" | "b" | "c", "a">; // "b" | "c" type T1 = Exclude<"a" | "b" | "c", "a" | "b">; // "c" type T2 = Exclude void), Function>; // string | number
3.7 Extract
Extract
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Extract from T those types that are assignable to U */ type Extract = T extends U ? T : never;
如果 T 能赋值给 U 类型的话,那么就会返回 T 类型,否则返回 never 类型。
示例:
type T0 = Extract<"a" | "b" | "c", "a" | "f">; // "a" type T1 = Extract void), Function>; // () => void
3.8 Omit
Omit
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Construct a type with the properties of T except for those in type K. */ type Omit = Pick>;
示例:
interface Todo { title: string; description: string; completed: boolean; } type TodoPreview = Omit; const todo: TodoPreview = { title: "Clean room", completed: false };
3.9 NonNullable
NonNullable
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Exclude null and undefined from T */ type NonNullable = T extends null | undefined ? never : T;
示例:
type T0 = NonNullable; // string | number type T1 = NonNullable; // string[]
3.10 ReturnType
ReturnType
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Obtain the return type of a function type */ type ReturnType any> = T extends (...args: any) => infer R ? R : any;
示例:
type T0 = ReturnType<() => string>; // string type T1 = ReturnType<(s: string) => void>; // void type T2 = ReturnType<() => T>; // {} type T3 = ReturnType<() => T>; // number[] type T4 = ReturnType; // any type T5 = ReturnType; // any type T6 = ReturnType; // Error type T7 = ReturnType; // Error
3.11 InstanceType
InstanceType 的作用是获取构造函数类型的实例类型。
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Obtain the return type of a constructor function type */ type InstanceType any> = T extends new (...args: any) => infer R ? R : any;
示例:
class C { x = 0; y = 0; } type T0 = InstanceType; // C type T1 = InstanceType; // any type T2 = InstanceType; // any type T3 = InstanceType; // Error type T4 = InstanceType; // Error
3.12 ThisType
ThisType
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Marker for contextual 'this' type */ interface ThisType { }
注意:使用 ThisType
示例:
interface Person { name: string; age: number; } const obj: ThisType = { dosth() { this.name // string } }
3.13 Parameters
Parameters
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Obtain the parameters of a function type in a tuple */ type Parameters any> = T extends (...args: infer P) => any ? P : never;
示例:
type A = Parameters<() => void>; // [] type B = Parameters; // [any] type C = Parameters; // [string, (number | undefined)?] type D = Parameters; // number[]
3.14 ConstructorParameters
ConstructorParameters
定义:
// node_modules/typescript/lib/lib.es5.d.ts /** * Obtain the parameters of a constructor function type in a tuple */ type ConstructorParameters any> = T extends new (...args: infer P) => any ? P : never;
示例:
type A = ConstructorParameters; // [(string | undefined)?] type B = ConstructorParameters; // string[] type C = ConstructorParameters; // [string, (string | undefined)?]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App