TypeScript入门

一、TypeScript快速搭建

1.1 快速搭建指令

-- 安装TypeScript
npm i -g typescript

-- 查看TypeScript的版本
tsc -v 

-- 全局安装ts-node
npm i -g ts-node

-- 快速创建一个tsconfig.json
tsc --init

1.2 HelloWorld入门

1)新建一个HelloWorld.ts文件

function say(word: string) {
    console.log(word)
}
say('Hello, World')

2)指令运行

--可以使用tsc命令将.ts转换成.js
tsc HelloWorld.ts --strict --alwaysStrict false --watch

--注意:
  指定转译的目标文件后,tsc 将忽略当前应用路径下的 tsconfig.json 配置,
  因此我们需要通过显式设定如下所示的参数,让 tsc 以严格模式检测并转译 TypeScript 代码。
  同时,我们可以给 tsc 设定一个 watch 参数监听文件内容变更,实时进行类型检测和代码转译

--可以直接用ts-node运行
ts-node HelloWord.ts

二、TypeScript深入学习

2.1 基础类型:TypeScirpt 与 JavaScript 有何不同

JavaScript 基础类型包含: string、number、bigint、boolean、undefined 、 symbol 和 null
【TypeScript对应JavaScript底层类型】

a)string类型

let firstname: string = 'Captain'; // 字符串字面量
let familyname: string = String('S'); // 显式类型转换
let fullname: string = `my name is ${firstname}.${familyname}`; // 模板字符串

b)数字类型

/** 十进制整数 */
let integer: number = 6;
/** 十进制整数 */
let integer2: number = Number(42);
/** 十进制浮点数 */
let decimal: number = 3.14;
/** 二进制整数 */
let binary: number = 0b1010;
/** 八进制整数 */
let octal: number = 0o744;
/** 十六进制整数 */
let hex: number = 0xf00d;
如果使用较少的大整数,那么我们可以使用bigint类型来表示,如下代码所示。

let big: bigint =  100n;

--number和bigint都表示数字,两个类型不兼容。

c)布尔值

const flag : boolean = false

d)Symbol

ES6后,TypeScript 开始支持新的Symbol原始类型, 通过Symbol构造函数,创建一个唯一标识

const symbol1: symbol = Symbol();
const symbol2: symbol = Symbol('42');

e)Array

const arr1: number[] = [1, 2, 3];
--等同于 const arr1: Array<number> = [1, 2, 3];

const arr2: string[] = ['x', 'y', 'z'];
--等同于 const arr2: Array<string> = ['x', 'y', 'z'];

f)Tuple

元组最重要的特性是可以限制数组元素的个数和类型,适合用来实现多值返回。
在 JavaScript 中并没有元组的概念,作为一门动态类型语言,它的优势是天然支持多类型元素数组。
出于较好的扩展性、可读性和稳定性考虑,我们往往会更偏向于把不同类型的值通过键值对的形式塞到一个对象中,再返回这个对象(尽管这样会增加代码量),而不是使用没有任何限制的数组。
TypeScript 的元组类型正好弥补了这个不足,使得定义包含固定个数元素、每个元素类型未必相同的数组成为可能。

type TupleDemo = [string, number]
const tupleDemo : TupleDemo = ['a', 1]
console.log(tupleDemo[0], tupleDemo[1])
----------------------------------------
--类型不匹配会报错 
const tupleDemo : TupleDemo = [2, 'c']
--要满足个数和类型符合

不可变元组:

  • 元素值不可变,不可再增删改元素值
type tupleDemo = readonly [string, number]
-----------------------------
或者通过as const声明为常量
const enumDemp = ['1', 2] as const

---------------------------------

g) any、 unknown、never

any 指的是一个任意类型,选择性绕过静态类型检测的作弊方式。

let a : any = 0
---等同于
let a = 0

任意类型可以给any赋值,any也可以给任意类型赋值【尽量避免使用any】

unknown,描述类型并不确定的变量。
任意类型可以给unknown赋值,但unknown只能给unknown或any赋值

let b : unknown = 40
---错误
b.toFixed(2)  //error
b.length  //error
--配合类型保护或类型断言才能对其操作,否则在编译阶段就会报错
--类型断言
let c : unknown;
c = 'a';
(c as string).length
--类型保护
let c : unknown;
c = 'hello';
if (typeof c === 'string') {
  c.length
}

never,描述表示不应存在的状态
适用场景:1. 无返回值的函数 2. 抛出异常错误函数

const foo = () : never => {
    while (true) {} // 死循环,永远也不会结束
}
const bar = () : never => {
  throw new Error()
}

h) void、 null、 undefined

void 类型:仅适用于表示没有返回值的函数。
undefined 类型: 表示一个可缺省、未定义的属性。
null类型:表示对象或属性可能是空值

2.2 TypeScript常用官方类型

2.2.1 Omit

定义:剔除/省略
使用:对已定义对象中剔除自己不需要的一部分形成新的定义类型

type SelectPickTuple = {
  value: string,
  text: string,
  children: Array<SelectChoseTuple>
}

type SelectPickChild = Omit<SelectPickTuple, 'children'>

2.2.2 Pick

定义:采集
使用:采集已定义对象中需要的部分形成新的定义类型

type TabTuple = {
  name: string,
  value: number
}

// 定义菜单子项类
type MenuItem = {
  url: string,
  value: string,
} & Pick<TabTuple, 'name'>

2.2.1 Partial

定义:转换为可选项
使用:将定义好的对象(包含必选+可选)转换为可选项

type TabTuple = {
  name: string,
  value: number
}

type newTabTuple: Partial<TabTuple> = {
  name : '123'
}

// 等同于
type TabTuple = {
  name?: string,
  value?: number
}

2.2.3 Required

定义:转换为必选项
使用:将定义好的对象(包含必选+可选)转换为必选项

type TabTuple = {
  name: string,
  value?: number
}

type newTabTuple: Required<TabTuple> = {
  name : '123',
  value : 1
}

// 等同于
type TabTuple = {
  name: string,
  value: number
}

2.2.4 Readonly

定义:只读
使用:Readonly 就是为类型对象每一项添加前缀 Readonly

type TabTuple = {
  readonly name: string,
  value?: number
}

type newTabTuple: Readonly<TabTuple> = {
  name : '123',
  value : 1
}

// 等同于
type TabTuple = {
  readonly name: string,
  readonly value: number
}

2.2.5 Exclude

定义:排除/不包含
使用:一般用于处理联合类型

type TupType = '1' | '2' | '3' // 联合类型

const TupleObj : Exclude<TupType, '1' | '2'> = '3'

//  从第一个联合类型参数中,将第二个联合类型中出现的联合项全部排除,只留下没有出现过的参数
type A = "age" | "name";
type B = "like" | "name";
type C = Exclude<A, B>;
// 解析:第一项是A,从第二项B开始,对比A中是否存在B项的类型,如果有,删除相同项,并返回剩余项

// 相对于
type C ='age'
------------------------------------------------------------
type A = "age" | "name";
type B = "age" | "name" | "height";
type C = Exclude<A, B>;

// 相对于
type C = never 

2.2.6 Extract

定义:提取/包括
使用:一般用于处理联合类型

type TupType = '1' | '2' | '3' // 联合类型

const TupleObj : Extract<TupType, '1' | '2'> = '1'

type A = "age" | "name";
type B = "like" | "eat";
type C = Extract<A, B>;
// 解析:第一项是A,从第二项B开始,对比A中是否存在B项的类型,如果有, 提取相同项,并返回提取项

//相当于 
type C = nerver
-----------------------------------------------------------------------------------
  
type A = "age" | "name";
type B = "like" | "eat" | "name";
type C = Extract<A, B>;
//相当于 
type C = "name"

2.2.7 ReturnType

定义:获取函数返回值的类型

// 正确用法
const myFun = () => ({
    name: 'zhangsan',
    age: 233,
    sex: '1',
    tel: 123456789,
    fun: () => {
        return 233;
    },
    arr: [1,2,3,4,5,6]
});

type Test2 = ReturnType<typeof myFun>; 

2.2.8 NonNullable

定义:排除null和undefined

type TabTuple = {
  name: string | null | undefined,
  value: number | null
}

type noNullTabTuple : NonNullable<TabTuple>

//等同于
type TabTuple = {
  name: string,
  value: number
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,312评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,578评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,337评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,134评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,161评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,303评论 1 280
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,761评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,421评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,609评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,450评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,504评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,194评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,760评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,836评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,066评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,612评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,178评论 2 341