TypeScript

什么是 TS
  • 以 JavaScript为基础构建的语言,一个 JavaScript 超集,
  • TypeScript 是完全支持 JavaScript 的,并扩展了 JavaScript 添加了类型
  • TS 不能直接被 JS 解析器直接执行,需要编译成 JS 在浏览器里执行

面向对象*

  • 在程序中所有的对象都分成了两个部分数据和功能,以人为例,人的身高体重年龄等都为数据,能睡觉能吃饭能喝水都为人具有的功能。数据在对象中成为属性,功能在对象中称为方法,所以简而言之,一切皆对象
基本类型
  • 类型声明
    1.通过类型声明可以指定变量、函数的实参和形参的类型
    2.指定类型后在为变量赋值时,TS 会自动识别值是否符合预设定类型,不符合则报错
    3.如果变量的类型声明和赋值同时进行,可以省略变量类型声明, 默认为值的类型
  • 语法
// let 变量名:类型 = 值;
let a:number = 1;
// a,b参数类型为number,并且函数返回值为 number
function fun(a:number,b:number):number {
  return a+b;
};
  • 类型
    1.number
    2.string
    3.boolean
    4.array
//  数组中每项的类型的限定
// 语法let a = string[]; 或者 let a =  Array<string>
let a = string[];
let a = Array<number>;
a = [1,2,3,4];

5.object

// {}用来指定对象中包含哪些属性
// 语法{属性名:类型}
let a : object;
a = {};
a = function () {};
// 并且再次赋值需要属性相同,如果在属性后加?,表示该属性可选
a = {name:string,age?:number};
a = {name: '张三',age:12}
// 表示 a 对象必须有 name 属性,[propName:string]表示可选添加任意字符串类型的属性名,:any表示任意类型的属性值
a = {name:string,[propName:string]:any}
// 设置函数的类型声明
// 语法let a = (形参:类型,形参:类型...)=> 返回值
let a = (b:number,c:number) => number
a = (num1,num2) {
   return num1 + num2
};

6.字面量 (限制变量的值就是字面量的值)

// 此后 a 的值只能是10或者12,赋值其他值报错
let a : 10 | 12;

7.any (任意类型)

// 类型为 any 后可以任意赋值,相当于关闭了类型检测,不推荐使用
// 声明变量后不指定类型,默认为隐式 any
let a : any;
a = 10;
a = 'hello';
a = false;

8.unknown (未知类型的值,类型安全的 any)

// any 和 unknown 的区别在与 any 给其他类型赋值时其他的类型也会变成 any,unknown 不会
let a : unknown;
a = 10;
a = 'hello';
a = false;
let b:number;
b = a; // 赋值会报错 unknown 类型不能赋值给 number

9.void (没有值或 undefined)

// void类型一般用于函数,表示函数返回空值或者 undefined
function fn():void {
     return undefine; |  return;
} 

10.never (不能是任何值)

// never类型一般用于函数,表示函数永远不会返回值
function fn():never {
} 

11.tuple (元组,TS 新增类型,固定长度数组)

// 限制数组长度和每项的类型,不能多也不能少
// 语法 [类型,类型,...]
let a = [string,number]
a = ['张三',18]

12.enum (TS 新增类型,枚举)

enum Gender {
    male,
    female
}
let i = {name:string,gender:Gender};
i = {
    name: '孙悟空',
    gender:Gender.male
}

  • 类型断言
    可以告诉解析器变量的实际类型
 //  变量 as 类型
//  <类型>变量
let a : number;
let s :12
s = a as number;  // 告诉解析器 s 的值确定为 number
s = <number>a; //  另一种写法
  • 类型别名
    可以定义一个类型,重读使用
type Mytype = string;
let a:Mytype;
let b:Mytype;
a = '张三';
b = '李四';

编译选项

  • tsconfig.json TS配置文件
{
    // 指定哪些文件需要被编译
    "include": ["./ts/src/**/*"],
    // 指定哪些文件不能被编译,有默认值 node_modules,bower_components,jspm_packages
    "exclude": ["./ts/src/app.ts"],
    // 继承其他的配置文件
    // "extends": ["../ts/ts"]
    "compilerOptions": {
        // target 指定 TS 编译后的 JS 版本
        // 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', 'es2022', 'esnext'
        "target": "ES2015",

        // module 指定要使用的模块化规范
        // 'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'es2022', 'esnext', 'node16', 'nodenext'
        "module": "System",

        // lib 指定项目中使用的库,一般不需要修改
        // "lib": []

        // outDir 指定编译后的文件的路径
        "outDir": "./ts/list",

        // outFile 将编译后的代码合并到一个 js 文件中
        "outFile": "./ts/list/app.js",

        // checkJs是否编译 JS 文件,默认是 false
        "allowJs": false,

        // checkJs是否检查 JS 代码是否符合 TS 规范,默认是 false
        "checkJs": false,

        // removeComments是否取消注释
        "removeComments": false,

        // 所有严格检查的总开关
        "strict": true,

        // noEmit是否生成编译后的文件 
        "noEmit": false,

        // noEmitOnError报错后不会编译
        "noEmitOnError": false,

        // alwaysStrict 是否使用 js 严格模式
        "alwaysStrict": true,

        // 检查是否存在隐式 any 类型
        "noImplicitAny": true,

        // 检查是否存在不明确类型的 this
        "noImplicitThis": true,

        // 检查是否存在空值
        "strictNullChecks": true,
    }
}

类(class)

  • 直接定义的属性是实例属性,需要通过对象实例来获取
  • 用 static 定义的属性是静态属性(类属性),可以直接通过类获取,方法同样
  • readonly只读属性,不能修改
  • constructor构造函数,在每次实例化类时调用
class person {
    // 实例属性
    name: string = '张三';
    // 静态属性 
    static age: number = 18;
    // readonly只读属性
    readonly height: number = 100
    // constructor 构造函数
    constructor(name: string, age: number) { 
          this.name = name;
          this.age = age;
    }
    // 定义方法
    seyHello() {
        console.log('hello',this.name);
    }
}
let obj = new person('张三',18,);
// 实例属性调用
console.log(obj.name);
// 静态属性调用
console.log(person.age);
// 实例方法调用
console.log(obj.seyHello());

类继承

  • dog 类继承 Animal类,Animal为父类,dog 为子类
  • 使用继承后子类拥有所有父类的属性和方法
  • 子类中可以直接添加父类中没有的属性和方法
  • 如果在子类中添加了和父类相同的方法,则子类的方法会覆盖父类的方法
  • 子类中super就相当于父类实例
  • 如果在子类中调用 constructor ,那么就相当与覆盖了父类的 constructor 调用,所以必须在子类调用 constructor 添加 super();手动调用父类的constructor
// 父类
class Animal {
    name: string;
    age: number;
    constructor(name: string, age: number) { 
        this.name = name;
        this.age = age;
    }
    bark() { 
        console.log('bark',this.name);
    }
}
// 子类
class dog extends Animal {
    age: number;
    constructor(name: string, age: number) {
        // 调用 super()方法,代替父类的构造函数调用
        super(name,18)
        this.age = age;
    }
    // 覆盖父类中 bark 方法
    bark() { 
        // 通过 super 调用父类的方法
        super.bark();
        console.log('bark覆盖',this.name);
    }
}
const dogObj = new dog('小明', 12);
dogObj.bark();

接口

  • interface 接口用来定义类中包含的属性和方法,也可以当作 type 类型声明去使用
  • 接口只定义类的结构不考虑实际值,接口中的所有属性不能有实际值,所有的方法都是抽象方法
  • 通过implements实现接口,就是按照接口的要求创建类
interface myInterface { 
    name: string;
    sayHello():void;
}
// implements 实现接口
class an implements myInterface { 
    name: string;
    constructor(name: string) { 
        this.name = name;
    }
    sayHello() {
        
    }
}

属性封装修改(访问) get&set

  • private 修饰后的属性只能在内部访问,需要暴露 geter 和 seter 方法供外部访问修改
  • 这样做的好处是,数据安全性,不能被外部随意访问修改,暴露了修改和访问的方法才能
  • public默认修饰符,可以在任意位置访问修改(包括子类), private 只能在类内部访问修改,protected 受保护的属性,只能在父类和子类中访问修改
// private 修饰后的属性只能在内部访问,需要暴露 geter 和 seter 方法供外部访问修改
// 这样做的好处是,数据安全性,不能被外部随意访问修改,暴露了修改和访问的方法才能
// 
// 属性修饰符 
class A { 
    // public默认修饰符,可以在任意位置访问修改
    public _name: string;
    // private 只能在类内部访问修改
    private _age: number;
    // protected 只能在父类和子类中访问修改
    protected _sex: string;
    constructor(name: string, age: number,sex: string) { 
        this._sex = sex;
        this._name = name;
        this._age = age;
    }
    // 访问属性 get
    get age() { 
        return this._age;
    }
    // 修改属性 set
    set age(age: number) { 
        this._age = age;
    }
}
const myObj = new A('张三', 12,'男');
// 通过 set 方法修改属性 age
myObj.age = 10;
// 访问修改后的 age
console.log(myObj.age);

class B extends A{ 
    fn() {
        // 访问父类中的 protected 修饰属性
        console.log('sex',this._sex);
    }
}
const Bfn = new B('张三', 12, '女');
Bfn.fn();

属性简写

  • 可以直接将属性定义在构造函数中,加 public 修饰符
class D {
    constructor(public name: string,public age: number,public sex: string) { 
    }
}
const d = new D('张三', 12, '男');
console.log(d)

泛型

  • 如果在定义类或函数时,如果类型不明确就可以用泛型
// 定义泛型 T,K
class myClass<T,K> {
    name:T;
    constructor(name:T) {  
        this.name = name;
    }
}
const  J = new myClass(10); // 不指定泛型,TS 自动判断类型
const  H = new myClass<string,number>('张三'); // 指定泛型
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 推荐阅读地址 掘金[https://juejin.cn/post/6927452747218288654] git...
    林一一呢阅读 1,613评论 0 5
  • 本文目录: 1.创建对象实例 2.继承 3.静态方法和属性 4.访问修饰符 5.readonly 6.抽象类 1....
    前端辉羽阅读 1,242评论 0 3
  • 1.js语言是动态弱类型语言 赋值各种类型不报错 函数有参数不传参调用,传多个参调用也不报错2.ts是静态语...
    前端林木木阅读 540评论 0 0
  • 一、类的简介 使用class关键字来定义一个类,类中主要包含了两个部分:属性和方法; 直接定义的属性相当于在con...
    欧石楠阅读 965评论 0 0
  • ts的优点:静态编译提示错误,强类型,接口和继承,是js的超集,需要编译后执行 编译 1、ts后缀建立文件后通过t...
    看到这朵小fa了么阅读 452评论 0 0