typescript学习笔记

  随着前端的发展,js越来越火,但是js有许多不合理或者说不完美的地方

  尽管从es5,es6,es7等版本升级能为js完善了不少地方,但是js始终是一个弱类型语言,稍微不注意会出现很多奇怪的bug,于是ts变得越来越重要,越来越受重视了.

ts中的基础类型

//数字number类型
const num: number = 123;

//字符串string类型
const str: string = 'abc';

//数组array类型,2种方式
const arr1: number[] = [1, 2, 3]; //里面的元素只能是数字类型

const arr2: Array<number> = [1, 2, 3]; //和上面一样

//元祖类型tuple 属于数组的一种,可以指定里面的元素为不同类型
const arrT: [number, string] = [123, 'abc'];

//枚举enum
enum Flag {error, success}  //error就是0,success就是1
// enum Flag {error = 1, success = 0}//也可以自行指定

let state: Flag = Flag.success; //1

//any类型,其实等于没指定..
let anyType:any = 123;  //先是声明为数字
anyType = 'abc';  //然后再声明为abc也不会报错,因为是any

// null和undefined
let numUn:number|null|undefined ;

let a:null = null;//null类型就只能为null

let b:undefined = undefined; //undefined类型就只能为undefined

// void 一般用于定义函数没有返回值
function test():void{ //表示函数没有返回任何类型
    return 2 //会报错
}

//never类型,从来不会出现的类型,多数用于总是会抛出异常,或根本不会有返回值的类型

function error(message: string): never {
    throw new Error(message);
}

ts中函数的定义

//声明返回值
function test(name: string, age: number): string {
    //入参必填name类型为string,必填age类型为number,返回值为string
    return `name:${name},age:${age}`
}

//没有返回值
function test2(name: string, age: number): void {
    //void代表没有返回值
    console.log(name);
    console.log(age);
}

//可选参数
function test3(name: string, age?: number): void {
    //加个?可以设置为选填,但是如果要填一定要复合声明的类型
    //注意点:可选参数不能设置在必填参数前面
    console.log(name);
    console.log(age);
}

//函数重载,在js中,两个相同名称的函数会被覆盖,ts中可以触发重载
function plus(num: number):number;  //输入number,输出number
function plus(num: string):number;  //输入string,输入number
function plus(num: any):any{
    //上面两个算重载,这个不算,这个是写具体的操作,这个函数只能穿number和string其他会报错
    switch (typeof num){
        case 'number':
            return num+10;
        case 'string':
            return parseInt(num) + 10;
        default:
            return NaN;
    }
}

console.log(plus(10)); //20
console.log(plus('10')); //20
console.log(plus(true)); //ts会报错

ts中的类


//ts中的类
class Person{
    name:string;
    constructor(name:string){
        this.name = name;
        // console.log(this.sayName());
    }
    sayName():string{
        return this.name
    }
}

const p = new Person('joy');
p.sayName();

//ts中的类继承
class Child extends Person{
    age:number;
    constructor(age:number,name:string){
        super(name);
        this.age = age;
    }
    sayAge():number{
        return this.age
    }
}
const c = new Child(12,'ball');
c.sayAge();
c.sayName();

// public :公有都能访问
// protected :保护只能在自身类里面,子类里面可以通过this访问,类外面包括实例都不能访问
// private :只能在类里面访问
// 不加默认为public

ts中的静态方法

//静态方法
class People{
    name:string;

    constructor(name:string){
        // this.name = name;
        // console.log(this.sayName());
    }

    static sayName():string{
        //静态方法,实例不能调用,只能通过构造函数调用People.sayName
        return this.sex
    }

    static sex = 'male'; //同样静态属性也一样,只能通过构造函数或静态方法里面获取
}

抽象类

// 抽象类(抽象方法只能出现在抽象类)
// 抽象类感觉就是定个规矩,你继承的子类要遵循这个规矩
abstract class Animal{
    //不能实例化 可以用于继承,要求继承的子类必须拥有抽象方法
    abstract eat():any; //抽象方法且不能实现,子类继承必须拥有
}

class cat extends Animal{
    eat(){

    }
}

interface 接口

// interface 接口
// 定义了一个个对象只能有key为name,value为string类型和key为age,value为number类型属性
interface People{
    name:string;
    age:number
}
//用于对象规定了对象的参数
const p1:People = {
    name:'sdsd',
    age:23
};
//用于函数规定了入参的类型
function person(people:People){
    //定义了接口只能根据People也就是key为name,value为string类型和key为age,value为number
    console.log(people.name);
    console.log(people.age);
}

//可选属性
interface People2{
    //name可以要也可以不要,但是如果传就一定是string
    name?:string;
    age:number
}
//可以不传
const p2:People2 = {
    age:23
};
//用于函数也一样,那么可传可不传
//用于函数规定了入参的类型
function person2(people:People2){
    //定义了接口只能根据People也就是key为name,value为string类型和key为age,value为number
    console.log(people.name);
    console.log(people.age);
}

//另外一种规定函数参数方式
interface Params{
    (username:string,password:string,age:number):boolean;  //括号里面是入参,后面是返回值
}

interface Params2{
    (username:string,password:string,age:number):{username:string,age:number};  //括号里面是入参,后面是返回值
}

const login:Params = (username,password,age) => {
    console.log(username);
    console.log(password);
    console.log(age);
    return true
};

const login2:Params2 = (username,password,age) => {
    console.log(username);
    console.log(password);
    console.log(age);
    return {username,age}
};

login('ss','sdd',2);
login2('ss','sdd',2);

//也可以定义数组的接口
interface Arr{
    [index:number]:number  //索引为数字,元素都是数字类型
}

const arr:Arr = [123123,123123,213];

//同数组类似也可用于对象上
interface Obj{
    [index:string]:number|string  //索引为字符串也就是key,value可以为数字或者字符串
}

const obj:Obj = {
    name:'sb',
    age:22
};

//对类类型进行约束

interface God{
    name:string;
    play(name:string):string;
}

class MyGod implements God{
    name:'sddd';
    constructor(name){
        this.name = name;
    }
    play(name){
        return this.name
    }
}

interface接口继承

//interface接口继承

interface Animal {
    eat(): void
}

interface Person extends Animal {
    //接口Person 继承了 Animal
    work(): void
}

class People implements Person {
    work() {
        //根据interface约束了一定要有work
        console.log('work');
    }

    eat() {
        //Person 又继承了 Animal所以一定要eat
    }

    play() {

    }
}

class Boy extends People implements Person {
    //继承结合接口的约束,因为People引进又了work和eat,所以Boy里面没有也不会报错
}

泛型

//泛型,有时候我们并不知道传入的是什么,但是我们又希望传入传出一致
function getData<T>(value:T):T{
    //入参类型是T,出参也是T,
    //假如入参是string类型,那么T就是string,出参也是string
    return value
}

getData<string>('sdsd'); //T是string类型,出入参都是string

//类的泛型
class MinNum<T>{
    list:T[] = [];
    add(num:T){
        this.list.push(num)
    }
    min():T{
        let minNum:T = this.list[0];
        this.list.forEach((item)=>{
            if(item<minNum){
                minNum = item
            }
        });
        return minNum
    }
}

const arr = new MinNum<string>(); //这里可以指定也可以不指定
arr.add('a');
arr.add('b');
arr.add('c');
arr.add('d');
arr.add('e');
console.log(arr.min());  //a

const arr1 = new MinNum<number>(); //这里可以指定也可以不指定
arr1.add(1);
arr1.add(2);
arr1.add(3);
arr1.add(4);
arr1.add(5);
console.log(arr1.min());  //a

//泛型接口
interface config{
    <T>(value:T):T  //泛型
}

const getData2:config = function (value) {
    return value
};

getData2<string>('sdd'); //这里指定了string,入参和出参都只能是string


interface config2<T>{ //也可以放在上面
    (value:T):T  //泛型
}

const getData3:config2<string> = function (value) { //声明函数的时候声明类型
    return value
};

getData3('sdd'); //这里指定了string,入参和出参都只能是string

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

推荐阅读更多精彩内容