TS学习笔记

TypeScript

1 类型基础

1.1 原始数据类型

boolean、string、number、void、null、undefined、Symbol、BigInt
注意:
1、null与undefined是所有类型的子集。
2、由构造函数创建的对象本质是一个对象。如下代码便会报错。

let createdByNewBoolean: boolean = new Boolean(1);

// Type 'Boolean' is not assignable to type 'boolean'.
//   'boolean' is a primitive, but 'Boolean' is a wrapper object. Prefer using 'boolean' when possible.

3、void用于定义无返回值的函数,若用于定义变量,则只能赋值undefined/null,并无太大意义。

2.2 定义对象类型

ts中使用接口(interface)来定义对象,一方面约束了对象属性的类型,一方面约束了对象的形状(必须完全遵循接口属性的数量)。

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

let tom: Person = {
    name: 'Tom',
    age: 25
};

1、可选属性:属性名后加问号即可。
2、任意属性:定义了任意属性后,确定属性与可选属性必须是它的子集。
3、只读属性:readonly放于属性名前即可。约束了属性无法被重新赋值,但需注意的是,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候。
注意:接口一般首字母大写,官方推荐接口名以I开头更清晰

2.3 定义数组类型

1、类型+方括号定义。
2、数组泛型:Array<类型>
3、接口表示数组:数组的本质是对象,定义index为number即可。

interface NumberArray {
    [index: number]: number;
}
let fn: NumberArray = [1, 1, 2, 3, 5];

该定义方法多存在于类数组中,如函数的arguments,就是类数组,可以使用数组的length、使用下标获取到项,但是却无法使用任何数组的方法,如arr.sort(),且其本身有一个属性callee,指向当前的函数。此时就需要使用接口来定义。

interface IArgs{
[index: number]: number;
        length: number;
        callee: Function;
}
function sum() {
    let args: IArgs = arguments;
}

2.4 定义函数类型

1、需要对函数的参数及返回值进行类型约束。

let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
    return x + y;
};

往往左边的类型声明可以省略,因为它会通过类型推断自动得出类型。
2、可以用接口来定义函数

interface SearchFunc {
    (source: string, subString: string): boolean;
}

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

3、注意:
(1)可以写可选参数,也是后面加问号即可。但是必须按必须参数>可选参数的顺序来写。若参数设置了默认值,则将其认定为可选参数,且不受必须参数>可选参数的限制。
(2)剩余参数为一个数组,采用数组的方式定义即可
(3)函数的重载对于参数的类型限制可以采用联合类型声明的方式

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | void {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}

前两句代码的意义是为了明确当输入为number的时候、输出也必须为number等。TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面。

2 基础概念

2.1 类型推论

变量在定义时只赋了初值但没有指定类型,ts会自动推断类型并在后续的操作中校验。当然,若定义时并没有赋值,则会默认为any而不被校验。

2.2 联合类型

取值可以为多种中的一种,不同的类型用|分隔。
若变量未被赋值而不确定是哪一种类型时,只能访问所有类型共有的属性或方法。

2.3 类型断言

值 as 类型
可以跳过编译器的校验,即编辑者明确此处为何类型,通知ts以这种类型看待它而不去校验值。用途:明确此处断言类型后不会发生语法错误。

  • 联合类型可以被断言为其中一个类型
  • 父类可以被断言为子类
  • 任何类型都可以被断言为 any
  • any 可以被断言为任何类型
  • 要使得 A 能够被断言为 B,只需要 A 兼容 B 或 B 兼容 A 即可
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你关于 TypeScript 中 Symbol 和模块的问题。 首先,Symbol 是 TypeScript 中的一种新的基本数据类型,它可以用来创建唯一的标识符。在 TypeScript 中,Symbol 主要有两种用法: 1. 作为对象属性的键值,用来表示一个对象属性的唯一标识符。 2. 作为一个类的静态属性或方法,用来表示该类的唯一标识符。 下面是一个使用 Symbol 作为对象属性键值的示例: ```typescript const key = Symbol('myKey'); const obj = { [key]: 'value' }; console.log(obj[key]); // 输出'value' ``` 在上面的代码中,我们使用 Symbol('myKey') 创建了一个新的 Symbol,然后将该 Symbol 作为对象 obj 的属性键值,并赋值为'value'。最后,我们通过 obj[key] 的方式来访问该属性,并输出了'value'。 另外,模块是 TypeScript 中的另一个重要概念,它用来组织和管理代码。在 TypeScript 中,模块可以使用 import 和 export 命令来进行导入和导出。下面是一个使用模块的示例: ```typescript // moduleA.ts export const num = 123; // moduleB.ts import { num } from './moduleA'; console.log(num); // 输出123 ``` 在上面的代码中,我们定义了一个名为 num 的常量,并将其导出。然后,在另一个模块中,我们使用 import 命令将 num 导入,并通过 console.log 输出了它的值。 这就是关于 TypeScript 中 Symbol 和模块的简单介绍,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值