TypeScript基础语法 | 青训营笔记

48 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

TypeScript简介

为什么要学习TypeScript

动态类型:执行阶段再去进行类型匹配

静态类型:在执行前就确定类型,如python java

弱类型:在编译后确定数据类型,能随着环境的不同,自动变换类型

强类型:求变量的使用要严格符合定义,所有变量都必须先定义后使用

与JS的区别

  • js 动态类型 弱类型

  • Ts 静态类型 弱类型

优点

  • 静态类型

    • 可读性增强:基于语法解析TSDoc,ide增强

    • 可维护性增强:在编译阶段暴露大部分错误

  • JS的超集

    • 包含于兼容JS特性,支持共存

    • 支持渐进式引入与升级

基本语法

基础数据类型

与JS基本相同

  • 字符串
const q:string = 'string';
  • 数字
const w:number = 1;
  • 布尔值
const e:boolean = true;
  • null
const r:null = null;
  • undefined
const t:undefined = undefined;

函数类型

写法一

/* JS */
function add(x, y){
    return x + y;
}
/* TS */
function add(x: number, y: number): number {
    return x + y;
}

写法二

/* JS */
const mult = (x, y) => x * y;
/* TS */
const mult: (x: number, y: number) => number = (x, y) => x * y;

对比JS,其实就是要写上类型

还可以通过interface来写

interface IMult{
    (x: number, y: number): number;
}
const mult: Imult = (x, y) => x * y;

对象类型

const hm: Human = {
    Id: 1234567,
    name: 'zhangsan',
    sex: 'man',
    age: 18,
    hobby: 'programming',
}

interface Human{
    name: string;
    /* 只读约束 */
    readonly Id: number;
    sex: 'man' | 'woman';
    age: number;
    /* 可选属性 */
    hobby?: string;
    /* 任意属性 */
    [key: string]: any;
}
/* 添加只读约束readonly,不允许修改报错 */
hm.Id = 111;
/* 任意属性标注下可以添加任意属性 */
hm.plateform = 'data';
/* 除了可选属性之外,缺少任何属性都不能创建 */
const hm2:Human = {
    Id:123,
    name:'lisi',
}

数组类型

类型 + 方括号

type IArr1 = number[];
const arr1: IArr1 = [1,2,3,4,5];

泛型

type IArr2 = Array<string | number | Record<string, number>>;
const arr2: IArr2 = [1,2,{a:3}];

元祖

type IArr3 = [number,string,number];
const arr3: IArr3 = [1,'2',3];

接口

interface IArr4{
    [key: number]: any;
}
const arr4: IArr4 = [1,'string',{},[],() => null]

TS补充类型

空类型

表示无赋值

type IEmptyFunction = () => void;

任意类型

是所有类型的子类型

type IAnyType = any;

枚举类型

支持枚举值到枚举名的正、反向映射

enum EnumExample{
    add = '+',
    mult = '*',
}
EnumExample['add'] === '+';
EnumExample['+'] === 'add';

泛型

不预先指定具体的类型,而在使用的时候在指定类型

type INumArr = Array<number>;

泛型接口

interface IX<T, U>{
    key: T;
    val: U;
}

泛型类

class IMan<T>{
    instance: T;
}

泛型别名

type ITypeArr<T> = Array<T>;

泛型约束

默认是number,若指定约束后必须符合约束

type IGetRepeatStringArr = <T extends string>(target: T) => T[];
const getStrArr: IGetRepeatStringArr = target => new Array(100).fill(target);
getStrArr('123')

类型别名

通过type关键字定义别名

type IObjArr = Array<{
    key: string;
    [objKey: string]: any;
}>

类型断言

通过as关键字断言

function keyBy<T extends IObjArr>(objArr: Array<T>){
    const result = objArr.reauce((res, val, key) => {
        res[key] = val;
        return res;
    }, {});
    return result as Record<string, T>;
}

指定字符串、数字的字面值范围

用 | 指定范围

type IExample = '123' | '456' | '789';

总结与感想

在以前,我并没有接触甚至是听说过TypeScript这门语言(属于是孤陋寡闻),但经过这节课的初步了解,个人感觉这门语言的语法跟JS类似,但比JS更为严格、严谨,其中还融合了Java的部分思想和语法。

这次的笔记依然是注重课上内容(因为不看笔记不久就会忘),总的来说,仅靠一节课就掌握是不可能的事。就我目前水平,暂时也没运用得到TS的地方,所以仅仅当个了解了。