【typescript】记录typescript基本知识的学习

1.typescript特点

1.编译型的语言
2.强类型的语言
3.真正面向对象的语言

 

 2.全局安装

npm install -g typescript

 tips:ts编译成js:tsc demo.ts 

 

3.基础数据类型 

 字符串类型

let email:string="111@163.com"
let msg:string = `my email is ${email}`

 

布尔类型

let isTrue:boolean=false

 

 数字类型

let age:number=10

 

数组

let list:number[]=[1,2,3,4]
// 数组泛型,Array<元素类型>
let list: Array<number> = [1, 2, 3]

 

元组:已知元素数量和类型的数组

let arr:[string,number]=['aaa',10]

 元素的数量等于类型的种类,元素排列顺序与对应类型排列顺序一致

 

枚举

enum Weeks{mon,tue,wed}//索引从0开始
let day:Weeks=Weeks.mon;
console.log(day);//索引值
console.log(Weeks[0]);//对应的值
console.log(Weeks['mon']);

也可手动指定成员的数值

enum Weeks{mon = 2,tue,wed}

 

any(任何类型)

let x:any='a'
x=10

 

void(函数的返回值(无))

function fun():void{
    console.log(111);
    //return 111;//因为无返回值,所以这里抛异常
}

function fun1():string{//返回对应类型
    return '111';
}

void类型只能赋值undefine和null

let a: void = undefined;

 

undefine和null

let y:null=null
let y:undefined=undefined

 

never??Object??

 

 

4.联合数据类型

let x2:number | string | boolean
x2:true

 

类型推论

let x3=3;
//x3='';//根据初始化类型的值进行推论

推了个寂寞???

类型断言

let x5:string |number |boolean;
let strlength:number= x5.length; //报错,不知道x5是什么类型

let x5:string |number |boolean='aabb';
let strlength:number=x5.length;//不报错

let x5:string |number |boolean='aabb';
let strlength:number=(<string>x5).length;//不报错
let strlength1:number=(x5 as string).length;//不报错

 

 

5.接口

接口可理解为一种规范或者限制,行为的抽象,可以用来约束类,数组,函数,对象

对类的约束

//接口定义
// 自定义声明,不包含具体内容
interface Iprinter{//打印接口
    //约束函数规范
    //不包含函数体
    Printer(msg:string):string;
}


interface Imsg{
    getmsg():string;
}


// 实现接口,要实现里面的内容
class colorprinter implements Iprinter,Imsg{//实现多个接口

    Printer(msg:string):string{
        return '打印'+msg+'成功';
    }

    getmsg():string{
        return '实现信息接口';
    }
}

let p1 = new colorprinter();
console.log(p1.Printer('简历'));
console.log(p1.getmsg());

 

对函数的约束

interface Imyfunction{
    (a:string,b:number):boolean;//函数规范的定义
}


let fun1:Imyfunction;
fun1=function (a:string,b:number):boolean{
    return false;
}

 

 对数组的约束

interface Istuarr{
    [index:number]:string;
}

let arr1:Istuarr;
arr1 =['aa','bb'];

 

对对象的约束

interface Idara{
    name:string;
    readonly age:number;    //只读属性
    email?:string;//可选属性

}
function showdata(n:Idara){
    console.log(n);
}
showdata({name:'张三',age:19});

 

接口的继承

interface Printer{
    getmsg();
}

//接口继承接口
interface colorprinter extends Printer{
    printer();
}


//类实现接口
class hpprinter implements colorprinter{
    getmsg(){
       console.log('打印机');
    }
    printer(){
       console.log('彩色打印机');
    }
}

 

 

6.类

 类的定义

class Person{
    name:string;
    age:number;
    constructor(name:string,age:number){
        this.name = name;
        this.age = age;
    }
    printer(){
        return this.name +','+this.age;
    }
}
let p = new Person('lala',19);
console.log(p.printer());

 

类的继承

class Student extends Person{
    cardnum:string;
    school:string;
    constructor(cardnum:string,school:string){
        super('ee',20);
        this.cardnum = cardnum;
        this.school = school;
    }
    dowork(){
        return this.name +','+this.cardnum;
    }
}

let stu = new Student('11','学校');
console.log(stu.dowork());

 

 

7.访问修饰符

public / private / protected

  • public:类的内外部都可访问
  • private:只能在类的内部访问
  • protected:在类的内部及其子类可以访问

静态属性 / 静态方法

class food{
    // 实例属性
    name:string='食物';
    static age:number=10;//静态属性
    // 实例方法
    printer(){
        console.log('aaa');
    }
    static printer1(){
        console.log('bbb');
    }
}
// 静态属性  类名访问
food.age=1;
// 静态方法  类名访问
food.printer1();

 

多态

同一个父类下面的不同子类,有不同的实现

class animal{
    eat(){
        console.log('eat');
    }
}

class cat extends animal{
    eat(){
        console.log('cat');
    }
}

class dog extends animal{
    eat(){
        console.log('dot');
    }
}

// 不同的子类有不同的实现
let c1 = new cat();
c1.eat();

 

抽象类 / 抽象方法

//抽象类和抽象方法
//抽象类是提供其他类继承的基类(父类),不能直接被实例化
//抽象方法只能包含在抽象类中,抽象类中可以包含抽象方法和非抽象方法
// 子类继承抽象类,实现抽象方法

abstract class dian{
    abstract dianqi();//抽象方法,无具体的方法体
    run(){
        console.log('run');//非抽象方法
    }
}


class kongtiao extends dian{
    dianqi(){
        console.log('kongtiao');
    }
}

class bingxiang extends dian{
    dianqi(){
        console.log('bingxiang');
    }
}

let kongtiao1 = new kongtiao();
kongtiao1.dianqi();

 

 

8.函数

函数的定义

function add(x,y):number{
    return x+y;
}

let add1 = function(x,y):number{return x+y}

 

函数的参数(可选参数 / 默认参数 / 剩余参数)

//x为默认参数
function add2(x:number=10,y:number):number{
    return x+y;
}

//参数后有问号,表示是可选参数
function show(name,age?:number):void{
    console.log(name);
}
show('aaa');

// 剩余参数
function add3(x1,x2,...x:number[]):number{
    let sum = 0;
    for(let i=0;i<x.length;i++){
        sum+=x[i];
    }
    return x1+x2+sum;
}
console.log(add3(1,2,3,4,5,6));

 

函数重载

function getinfo(name:string):void;
function getinfo(age:string):void;
function getinfo(str:any):void{
    if(typeof str =='string'){
          console.log('名字'+str);
    }
    if(typeof str =='number'){
        console.log('年龄'+str);
    }
}

 

 

 

9.泛型 

 泛型函数

function printer<T>(arr:T[]):void{
    // for   /  for in   /for of
    for(let item of arr){
       console.log(item);
    }
}

printer<string>(['aa','bb','aa']);
printer<number>([11,22,33]);

 

泛型类

class myArrayList<T>{
    public name:T;
    public list:T[]=[];
    add(val:T):void{
        this.list.push(val);
    }
}

let arr = new myArrayList<number>();
arr.add(11);
arr.add(22);
console.log(arr.list);

 

泛型接口

interface Iadd<T>{
    (x:T,y:T):T;
}
var add1:Iadd<number>;
add1=function(x:number,y:number){
    return 111;
}
console.log(add1(1,5));

 

 

10.简单示例

1.todoList

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .item-ok{
            text-decoration: line-through;
            color:#ccc;
        }
    </style>
</head>
<body>
    <input type="text" id="content" placeholder="输入代办事项">
    <button id="btn">添加代办事项</button>

    <ul id="todolist">
        <li>一条代办</li>
        <li>me too</li>
    </ul>
    <script src="./todolist.js"></script>
</body>
</html>

 js代码:

// 1.定义代办事项类
class Todo{
    content:string;
    status:boolean;

    constructor(content:string,status:boolean){
        this.content = content;
        this.status = status;
    }
}


// 2.初始化代办信息
let todolist:Todo[]=[
    new Todo('第一条代办',true),
    new Todo('第二条代办',false)
];

// 3.渲染代办列表
const todoul = document.getElementById('todolist');
const content:HTMLInputElement = document.querySelector('#content');
const btn = document.getElementById('btn');
function renderList(){
    let listdom = '';
    if(todolist.length > 0){
        todolist.forEach(function(elm,index){
            // es6拼接
            listdom+=`<li class="${elm.status ? 'item-ok':''}">${elm.content}</li>`;
        });
    }else{
        listdom+=`<li>暂无代办</li>`;
    }
    todoul.innerHTML = listdom;
}

// 4.添加代办
function addTodo(){
    const contentVal = content.value.trim();
    if(!contentVal){
        alert('请输入代办');
        return false;
    }
    todolist.push(new Todo(contentVal,false));
    content.value = '';
    renderList();
}

btn.addEventListener('click',()=>{
    addTodo()
});

window.onload = function(){
    renderList();
}

2.购物车 

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .header li{
            float: left;
            list-style: none;
            margin-right: 100px;
        }
    </style>
</head>
<body>
    <ul class="header">
        <li>名称</li>
        <li>描述</li>
        <li>单价</li>
        <li>数量</li>
    </ul>
    <br/>
    <ul id="box">

    </ul>
    总价:<span id="sum"></span>
    <script src="09-购物车.js"></script>
</body>
</html>

js代码:

// 假数据
const cartGoodsList=[
    {
        id:'1',
        name:'苹果手机',
        desc:'aaaa',
        price:2000,
        count:1,
        isChecked:true
    },
    {
        id:'2',
        name:'小米手机',
        desc:'bbbb',
        price:1500,
        count:1,
        isChecked:true
    }
];

// 购物车类
class Cart{
    cartGoodsList=cartGoodsList;//购物车商品列表
    cartdom:HTMLElement = document.querySelector('#box');
    sumdom:HTMLElement = document.querySelector('#sum');
    
    // 渲染购物车
    renderCart(){
        let cartDom = '';
        this.cartGoodsList.forEach(item=>{
            cartDom+= 
            `<li>
                <input type="checkbox" ${item.isChecked ? 'checked':''} id="${item.id}"/>
                <span>${item.name}${item.desc}</span>
                ${item.price}  ${item.count}
            </li>`;
        });
        this.cartdom.innerHTML = cartDom;
    }

    // 渲染总价
    renderSum(){
        let total = 0;
        this.cartGoodsList.forEach(item=>{
            if(item.isChecked){
                total += item.price * item.count;
            }
        });
        this.sumdom.innerHTML = '¥'+total;
    }

    // 勾选/取消勾选
    checkGoods(id){
        this.cartGoodsList.forEach(item=>{
            if(item.id === id){
                item.isChecked = item.isChecked ? false:true;
            }
        });
        this.renderSum();
    }

    // 初始化
    init(){
        this.renderCart();
        this.renderSum();
        // 给每个li加上点击事件
        document.querySelectorAll('input').forEach(item=>{
            item.addEventListener('click',()=>{
                this.checkGoods(item.id);
            });
        });
    }
}

let cart = new Cart();
cart.init();

 

 tsconfig.js配置说明

 摘自:https://juejin.cn/post/6844904008583217165 

// tsconfig.json
{
    "compilerOptions": {
        // 不报告执行不到的代码错误。
        "allowUnreachableCode": true,
        // 必须标注为null类型,才可以赋值为null
        "strictNullChecks": true,
        // 严格模式, 强烈建议开启
        "strict": true,
        // 支持别名导入:
        // import * as React from "react"
        "esModuleInterop": true,
        // 目标js的版本
        "target": "es5",
        // 目标代码的模块结构版本
        "module": "es6",
        // 在表达式和声明上有隐含的 any类型时报错。
        "noImplicitAny": true,
        // 删除注释
        "removeComments": true,
        // 保留 const和 enum声明
        "preserveConstEnums": false,
        // 生成sourceMap    
        "sourceMap": true,
        // 目标文件所在路径
        "outDir": "./lib",
        // 编译过程中需要引入的库文件的列表
        "lib": [
            "dom",
            "es7"
        ],
        // 额外支持解构/forof等功能
        "downlevelIteration": true,
        // 是否生成声明文件
        "declaration": true,
        // 声明文件路径
        "declarationDir": "./lib",
        // 此处设置为node,才能解析import xx from 'xx'
        "moduleResolution": "node"
    },
    // 入口文件
    "include": [
        "src/main.ts"
    ]
}

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值