ts学习总结

本文概述了TypeScript的重要特性,包括类型系统、二进制/八进制转换、基本类型、null/undefined、联合类型、接口与对象、函数类型、枚举与类型断言。通过实例演示了如何在实践中运用这些概念并解决常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ts学习总结
ts最重要的特性:类型系统、适用于任何规模

数值

let num: number = 1

但是 ES6 中的二进制和八进制表示法,它们会被编译为十进制数字

字符串

let name: string = 'wujuan'

布尔值

let isDone: boolean = false
使用构造函数 Boolean 创造的对象不是布尔值
let createdByNewBoolean: boolean = new Boolean(1) 则会报错, 事实上 new Boolean() 返回的是一个 Boolean 对象
但是直接调用Boolean也可以返回一个boolean类型
let createdByBoolean: boolean = Boolean(1);

在 TypeScript 中,boolean 是 JavaScript 中的基本类型,而 Boolean 是 JavaScript 中的构造函数。其他基本类型(除了 null 和 undefined)一样。

Null 和 Undefined

let un: undefined = undefined
let nu: null = null

任意值

任意值(Any)用来表示允许赋值为任意类型。

let myname: any = '111'
myname = 111

tips:

1.在任意值上访问任何属性和方法都是允许的

2.变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型:

void

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

function myname(): void {
    console.log("Myname is WJ");
}

联合类型

联合类型表示取值可以为多种类型中的一种。

let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

对象类型–接口

interface Person {
    name: string;
    age: number;
}

let lily: Person = {
    name: 'lily',
    age: 28
}

定义的变量比接口多了或少了一些属性都是不允许的

interface Person {
    name: string;
    age: number;
}

let lily: Person = {
    name: 'lily'
}

Property 'age' is missing in type '{ name: string; }' but required in type 'Person'.

let Nike: Person = {
    name: 'Nike',
    age: 25,
    sex: 'female'
}

Property 'age' is missing in type '{ name: string; }' but required in type 'Person'.

若某个属性不是完全需要的,可以使用可选属性

interface Person {
    name: string;
    age?: number;
}

let lily: Person = {
    name: 'lily'
}

但是仍不允许添加未定义的属性:

interface Person {
    name: string;
    age?: number;
}

let lily: Person = {
    name: 'lily',
    sex: 'male'
}
Type '{ name: string; sex: string; }' is not assignable to type 'Person'.
  Object literal may only specify known properties, and 'sex' does not exist in type 'Person'.

如果希望一个接口允许有任意的属性,可以使用如下方法:

interface Person {
    name: string;
    age?: number;
    [propName: string]: any;
}

let tom: Person = {
    name: 'Tom',
    sex: 'male'
};

一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:

interface Person {
    name: string;
    age?: number;
    [propName: string]: string;
}

let lily: Person = {
    name: 'lily',
	age: 25,
    sex: 'male'
};
Property 'age' of type 'number | undefined' is not assignable to string index type 'string'.
Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Person'.
  Property 'age' is incompatible with index signature.
    Type 'number' is not assignable to type 'string'.

任意属性的值允许是 string,但是可选属性 age 的值却是 number,number 不是 string 的子属性,所以报错了,若想解决上述报错可以使用联合类型

interface Person {
    name: string;
    age?: number;
    [propName: string]: string | number | undefined;
}

let lily: Person = {
    name: 'lily',
	age: 25,
    sex: 'male'
};

只读属性

一些对象属性只能在对象刚刚创建的时候修改其值,你可以在属性名前用readonly来指定只读属性:

interface Person {
    readonly id: number;
    name: string;
    age?: number;
    [propName: string]: any;
}

let lily: Person = {
    id: 7625,
    name: 'lily',
    sex: 'male'
};

若在此时改变id的值 lily.id = 7658则会报错Cannot assign to ‘id’ because it is a read-only property.

数组类型

在ts中,数组类型有多种定义方式

方式一:类型+[]

let arr: number[] = [1, 2, 3, 4, 5]

表示该数组为数字类型的数组,不能接受其他类型的参数

方式二:数组泛型

let arr: Array<number> = [1, 2, 3, 4, 5]

方式三: 使用接口表示数组

interface numArray {
   [propName: number]: number;
}

let numArr: numArray = [1, 2, 3, 4]

如果不想约束数组元素的类型
let arr: any[] = [1, ‘str’, false]

函数类型

函数定义的方式有两种:函数声明和函数表达式

函数声明:

function sum(x: number, y: number): number {
    return x+y
}

函数表达式:

let mySum = function (x: number, y: number): number {
    return x + y;
};
用接口定义函数的形状
interface SearchFunc {
    (source: string, subString: string): boolean;
}

let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
    return source.search(subString) !== -1;
}

函数的可选参数:和接口的可选参数类似,使用?来表示可选参数,但是可选参数必须在必选参数后面,可选参数后面不允许再出现必需参数了:

function introduce(name: string, age?: number) {
    if(age) {
        return `My name is ${name}, 我今年${age}岁`
    }else {
        return `My name is ${name}`
    }
}
let Nike = introduce('Nike', 21)

函数的参数默认值:可以给函数添加默认值

function introduce(name: string, age: number = 32) {
    if(age) {
        return `My name is ${name}, 我今年${age}岁`
    }else {
        return `My name is ${name}`
    }
}
let Nike = introduce('Nike')

剩余参数:可以使用 …rest 的方式获取函数中的剩余参数

function push(array, ...items) {
    items.forEach(function(item) {
        array.push(item);
    });
}

let a: any[] = [];
push(a, 1, 2, 3);

类型断言

类型断言(Type Assertion)可以用来手动指定一个值的类型

值 as 类型 

tips:

1、联合类型可以被断言为其中一个类型

2、父类可以被断言为子类

3、任何类型都可以被断言为 any

4、any 可以被断言为任何类型

当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型中共有的属性或方法,使用类型断言可以避免访问其没有属性和方法时的编译报错,但是在运行时没有该属性或者方法还是会报错

枚举

枚举(Enum)类型用于取值被限定在一定范围内的场景,枚举使用 enum 关键字来定义,枚举成员会被赋值为从0开始递增的数字,同时也会对枚举值和枚举名进行反向映射

enum Color {
    blue,
    yellow,
    red,
    green
}
console.log(Color['blue'] === 0) // true
console.log(Color[1] === 'yellow') // true

常数枚举
常数枚举是使用const enum 定义的枚举类型:和普通枚举的区别是它会在编译阶段被删除,并且不能包含计算成员

<think>嗯,用户之前已经问过如何快速入门TypeScript,现在又要求做一个知识点总结。我需要先回顾之前的回答,确保内容不重复,同时更系统性地整理核心知识点。 用户可能是已经通过快速入门指南学习了一段时间,现在需要巩固知识,或者想要一个结构化的复习资料。这时候,知识点总结应该比入门指南更全面,覆盖更基础到进阶的内容,帮助用户查漏补缺。 首先,要确定用户的需求层次。他们可能已经掌握了基础,现在需要更深入的理解,或者希望有一个参考手册。因此,总结需要分模块,逻辑清晰,便于查阅。同时,需要包含示例代码,帮助用户理解每个概念的应用。 接下来,我需要整理TypeScript的主要知识点,包括类型系统、高级类型、函数与类、模块与命名空间、配置与工程化等。每个部分需要简明扼要,重点突出,避免冗长。比如类型系统中,基本类型、联合类型类型别名、接口和类型推断都是基础,必须涵盖。 同时,要考虑到用户可能在实际开发中遇到的问题,比如泛型的使用、装饰器的配置、第三方库的类型声明等。这些实战技巧对用户来说非常实用,应该作为独立的部分详细说明。 另外,用户可能对配置文件和工具链不太熟悉,所以需要解释tsconfig.json的关键配置项,以及如何与构建工具和框架集成。这部分内容可以帮助用户优化项目设置,提高开发效率。 最后,要推荐一些进阶内容和资源,帮助用户继续深入学习。比如Utility Types、类型守卫、声明合并等高级主题,以及官方文档和社区资源,这些都能帮助用户扩展知识面。 在组织内容时,要确保每个知识点都有对应的代码示例,使用正确的LaTeX格式,符合之前的系统指令。同时,结构要清晰,使用标题和标题分层,便于用户快速找到所需信息。 需要检查是否有遗漏的重要概念,比如枚举、类型断言、模块解析策略等。这些内容虽然可能属于进阶部分,但在总结中也应简要提及,确保全面性。 最后,总结部分要强调实践的重要性,鼓励用户通过项目应用所学知识,加深理解。同时,提醒常见错误和调试技巧,帮助用户避免常见陷阱,提高开发效率。</think>以下是 TypeScript 核心知识点的系统性总结,分模块整理关键概念和示例: --- ### 一、类型系统(Type System) #### 1. 基础类型 ```typescript let str: string = "hello"; // 字符串 let num: number = 42; // 数字 let bool: boolean = true; // 布尔 let arr: number[] = [1, 2, 3]; // 数组 let tuple: [string, number] = ["Alice", 30]; // 元组 let anyVal: any = "任意类型"; // 任意类型 ``` #### 2. 联合类型类型别名 ```typescript type ID = string | number; // 联合类型 type Point = { x: number, y: number }; // 类型别名 ``` #### 3. 接口(Interface) ```typescript interface User { name: string; age?: number; // 可选属性 readonly id: number; // 只读属性 [prop: string]: any; // 索引签名 } const user: User = { id: 1, name: "Bob" }; ``` #### 4. 类型推断与断言 ```typescript let inferredStr = "自动推断为string"; // 类型推断 let val: any = "this is a string"; let strLength: number = (val as string).length; // 类型断言 ``` --- ### 二、高级类型 #### 1. 泛型(Generics) ```typescript function identity<T>(arg: T): T { return arg; } interface GenericArray<T> { data: T[]; } const numArray: GenericArray<number> = { data: [1, 2, 3] }; ``` #### 2. 工具类型(Utility Types) ```typescript type PartialUser = Partial<User>; // 所有属性变为可选 type ReadonlyUser = Readonly<User>; // 所有属性变为只读 type NameOnly = Pick<User, "name">; // 选取特定属性 type WithoutId = Omit<User, "id">; // 排除特定属性 ``` #### 3. 条件类型与映射类型 ```typescript type IsString<T> = T extends string ? true : false; type KeysToNumbers<T> = { [K in keyof T]: number }; ``` --- ### 三、函数与类 #### 1. 函数类型 ```typescript type AddFunc = (a: number, b: number) => number; const add: AddFunc = (a, b) => a + b; ``` #### 2. 类与修饰符 ```typescript class Animal { private name: string; // 私有属性 protected age: number; // 受保护属性 public constructor(name: string) { this.name = name; } static className = "Animal"; // 静态属性 } ``` #### 3. 抽象类与接口实现 ```typescript abstract class Shape { abstract area(): number; // 抽象方法 } class Circle implements Shape { radius: number; area() { return Math.PI * this.radius ** 2; } } ``` --- ### 四、模块与命名空间 #### 1. ES模块 ```typescript // math.ts export function sum(a: number, b: number) { return a + b; } // main.ts import { sum } from './math'; ``` #### 2. 命名空间(Namespace) ```typescript namespace Geometry { export interface Point { x: number, y: number } export class Circle { /*...*/ } } const point: Geometry.Point = { x: 0, y: 0 }; ``` --- ### 五、工程化配置 #### 1. `tsconfig.json` 关键配置 ```json { "compilerOptions": { "target": "ES6", // 编译目标 "module": "CommonJS", // 模块系统 "strict": true, // 严格模式 "outDir": "./dist", // 输出目录 "esModuleInterop": true // 兼容CommonJS/ES模块 } } ``` #### 2. 类型声明文件(.d.ts) ```typescript // global.d.ts declare module "*.png" { const path: string; export default path; } declare const __VERSION__: string; // 声明全局变量 ``` --- ### 六、常见模式与技巧 #### 1. 类型守卫 ```typescript function isString(val: any): val is string { return typeof val === "string"; } ``` #### 2. 索引类型与 keyof ```typescript function getProperty<T, K extends keyof T>(obj:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值