typescript基础

[TOC]

1.类型声明

let a: number;
let b = false;//隐式类型

//函数和返回值
function sum(a: number, b: number): number {
    return a + b;
}

1.1 类型

类型 例子 描述
number 1,2,3 任意数字
string "hi",'hi',hi 任意字符串
boolean true、false 布尔值
字面量 其本身 限制变量的值就是该变量的值
any * 任意类型
unknown * 类型安全的any
void 空值(undefined) 没有值(或undefined)
never 没有值 不能是任何值
object {name:'孙悟空'} 任意的js对象
array [1,2,3] 任意的js数组
tuple [4,5] 元祖,ts新增类型,固定长度数组
enum enum{A,B} 枚举,ts新增类型

1.2 字面量类型声明 - 定义值有范围

//1.定义后无法修改,类似常量
let b : 10;
//b = 11;修改会报错

//2.定义多个值用|连接, 
let gender: "man" | "women";
gender = "man";
gender = "women";
gender = "other";//报错

//3. 定义两种类型
let c: string | boolean;
c = "hello";
c = false;


1.3 any - 任意类型

//any类型变量,相当于关闭了ts的类型检测
let d:any;
d = 10;
d = "hello";
d = false;

//隐式any类型
let a;

//会污染s的类型,不会警告
let e :any;
e = false;
e = "hello";
let s:string;
s = e;

1.4 unknown - 类型安全的any

let e :unknown;
e = false;
e = "hello";
let s:string;

//1.不能将类型“unknown”分配给类型“string”。
//s = e;
//2.正确的做法,判断类型一致在赋值
if(typeof e == 'string'){
    s = e;
}
//3.类型断言
s = e as string;
s = <string>e;

1.5 void | never

function fn(type: number): string | boolean {
    if (type == 1) {
        return '1';
    } else {
        return false;
    }
}
//用来表示空,没有返回值
function fn2(): void {

}
//什么都没有 不是void
function fn3():never {
    throw new Error("报错")
}

1.6 object

//1.不常用
let a: object;
a = {}
a = function () { }

/*2.
{}指定对象中包含哪些属性
语法:{属性名:属性值,属性名2:属性值2}
属性名后加上? 表示该属性是可选的
*/
let b: { name: string, age?: number };
b = { name: 'zhuzi', age: 18 };
b = { name: 'zhuzi' };

//3.[propName: string]: any 表示任意类型的属性值
let c: { name: string, [propName: string]: any };
c = { name: 'zhuzi', a: 10, b: "hello" };

/*4.
设置函数结构的类型声明
语法:(形参:类型,形参2:类型2)=>返回值类型
*/
let d: (a: number, b: number) => number;
d = function (a: number, b: number): number {
    return a + b;
}

1.7 array

/*
两种表示
    类型[]
    Array<类型>
*/
let a: number[];
a = [1, 2, 3];

let b :Array<string>;
b = ["h"]

1.8 tuple - 长度固定的数组

let c : [string,number];
c = ['zhu',18];

1.9 enum

enum Gender {
    Male = 0,
    Female
}
let gender:Gender;
gender = Gender.Male;

1.10 type 、 &

//并且
let m:{name:string} & {age:number};
m = {name:'zhu',age:18}

// 别名
type myType = 1|2|3|4|5;
let k:myType

2.类

2.1 类的简介

/*

class 关键字定义类
    实例属性
    实例方法
    
注意:属性需要初始化。 默认值或constructor 赋值    
*/

class Person {

    //类属性、静态属性
    static total:number;
    //类方法
    static classFun():void{
        console.log('这是类方法');
    }

    //实例属性
    name:String = "孙悟空";
    age:number = 500;


    //实例方案
    sayHello():void{
        console.log(`Hello,my name is ${this.name}`);
        
    }

}

let person = new Person();
console.log(person);
person.sayHello();

2.2 构造函数和this

//类的构造方案和this
class Dog {
    name:string;
    age:number;

    /*
    1.构造函数会在对象创建时调用
    2.构造函数中的对象就是当前创建的对象
    3.可以通过this 向当前对象添加属性
    */
    constructor (name:string,age:number){
        this.name = name;
        this.age = age;
    }

    barke(){
        console.log(`${this.name} 汪汪叫`);
    }
}
let dog1 = new Dog('旺财',2);
let dog2 = new Dog('小黑',10);
dog1.barke();

2.3 继承

//类的继承
/*
Animal:父类 ,Dog:子类 
1. 子类拥有父类所有的属性和方法
2. 子类可以有自己属性和方法
3. 子类可以重写父类的方法
*/
class Animal {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    barke(){
        console.log('动物叫...');
        
    }
}

class Dog extends Animal {
    barke(): void {
        console.log(`${this.name} 狗叫...`);
    }
    run(){
        console.log('狗跑');
        
    }
}

class Cat extends Animal {
    barke(): void {
        console.log(`${this.name} 猫叫...`);
    }
}

let dog = new Dog('旺财',6);
let cat = new Cat('招财猫',10)

dog.barke();
cat.barke();

2.4 super 关键字

class Animal {
    name: string;

    constructor(name: string) {
        this.name = name;
    }
    barke() {
        console.log('动物叫...');
    }
}

class Dog extends Animal {
    age:number;

    /*
    1.如果子类重写的父类的构造方法 必须调用super 
    */
    constructor(name:string,age:number){
        super(name);//调用父类的构造方法
        this.age = age;
    }
    barke() {
        //2.调用父类的方法
        super.barke();
        console.log('狗叫...');
        
    }
}
let dog = new Dog('旺财', 6);
console.log(dog);
dog.barke();

2.5 抽象类 abstrack


/*
抽象类 abstract 类
1.不能被实例化,只能继承
2.可以添加抽象方法子类必须实现
*/
abstract class Animal {
    name: string;

    constructor(name: string) {
        this.name = name;
    }
    //抽象方法没有实现,子类必须重写
    abstract barke():void;
}
class Dog extends Animal {
    barke() {
        console.log('狗叫...');
    }
}
let dog = new Dog('旺财');
dog.barke();

2.6 interface 接口

  • 声明使用

    /*
    1.定义类结构,一个类对象应该包含哪些属性和方法
    2.可以当做声明使用
    */
    interface Person{
        name:string,
        age:number
    }
    //3.可以重复声明,会合并
    interface Person{
        gender:number
    }
    //对比type
    // 对对象结构的限制
    type personType = {
        name:string,
        age:number
    }
    let person:personType = {
        name:'朱允见',
        age:18
    }
    
  • 限制类的结构

    /*
    1.定义类的时候限制类结构 implements 实现该接口
    2.属性不能有值,方法不能有实现,且实现类都必须实现
    
    */
    interface MyInterface {
        name:string;
        
        sayHello():void;
    }
    class MyClass implements MyInterface {
        name: string;
    
        constructor(name:string){
            this.name = name;
        }
        sayHello() {
            console.log('hi');
        }
        
    }
    let my = new MyClass('小猪');
    console.log(my);
    

2.7 get、set 属性定义位置

class Person {
    /*
        readonly:只读

         修饰符:默认是public
        public:公共的 
        protected:受保护的只能在当前类和子类中使用
        private:私有的,仅在本类可访问
    
    */

    private  _age:number
    constructor(age:number){
        this._age = age;
    }


    //get set 属性存取器
    get age(){
        return this._age;
    }
    set age(value:number){
         if(value<0)return;
        this._age = value;
    }
}

//属性定义可以直接写在构造函数里
class C {
    constructor(public name:string,public age:number,){
        this.age = age;
        this.name = name;
    }
}
let c = new C("测试类",10)

2.8 泛型

/*
泛型 
在定义函数或类是类型不明确,就可以使用泛型
*/

//1 单个泛型
function fn<T>(a: T) {
    return a;
}
//自动推断
let result1 = fn(1);
//指定泛型类型
let result11 = fn<string>('hello');


//2.多个泛型
function fn2<K, T>(a: K, b: T): K {
    return a;
}
let result2 = fn2<number,string>(10,'hello')


//3. 限制泛型
interface MyInterface {
    length:number
}
//3.1 T 必须是MyInterface 的实现类(子类)
function fn3<T extends MyInterface>(a:T):number{
    return a.length;
}
fn3<string>('hello');

//4 类 中泛型
class MyClass <T>{
    name:T;
    constructor(name:T){
        this.name = name;
    }
}
let obj = new MyClass<string>('name');

Ts 项目演练模块化开发demo

贪吃蛇TS 模块化开发demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容