首页 > 其他分享 >2020-1-31-Typescript基础知识

2020-1-31-Typescript基础知识

时间:2024-03-22 17:03:59浏览次数:22  
标签:function Typescript console name 31 2020 log var string

typescript安装、编译、数据类型、函数声明、ES5中的类、TS中的类、接口、泛型、装饰器

Typescript安装

npm installl -g typescript

编译成js

tsc aaa.ts

执行该命令后会自动生成js文件


在VScode中设置保存后自动编译

1.生成tscconfig.json文件

tsc --init

2.修改tscconfig.json文件中outDir:'/js',此后生成的js文件会存入js的文件夹中

3.VScode编辑器里

任务-运行任务,点击监视tsconfig.json


数据类型

1.布尔类型 boolean

2.数字类型 number

3.字符串类型 string

4.数组类型 array

let ar:number[]=[1,2,3]

5.元组类型 tuple

let ar:[string,number,number]=["1",2,3]

实际上就是一个允许不同数据类型的数组

6.枚举类型 enum

enum color {red,green,blue}
let c:color=color.green
console.log(c)//1

7.任意类型 any

window.onload=function(){
    let box:any=document.getElementById("div")//获取元素时,元素对象类型为any
    box.innerHTML="hello"
}

8.null和undefined

var num:number//num未进行初始化,编译报错
console.log(num)

var num:number|null|undefined//num如果未初始化,赋值为null或undefined
console.log(num)

9.void类型

function run():void{//该方法无返回值
	console.log("run")
}

10.never类型

哪些永远不存在的值的类型,返回never的函数必须存在无法达到的终点

//这是官方文档的例子
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
    throw new Error(message);
}

// 推断的返回值类型为never
function fail() {
    return error("Something failed");//会抛出错误
}

// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
    while (true) {
    }
}

函数声明

1.普通方式和匿名函数方式声明

//普通方式
function run():void{
	console.log("run")
}
run()//输出run

//匿名函数方式
var run1=function():void{
	console.log("run")
}
run1()//输出run

2.参数、可选参数、默认参数

//参数
function getinfo(name:string,age:number):string{
    return `${name}--${age}`
}
console.log(getinfo("aaa",25))//输出aaa--25

//可选参数,必须配置到参数的最后面
function getinfo1(name:string,age?:number):string{
    return `${name}--${age}`
}
console.log(getinfo1("aaa"))//输出aaa--undefined

//默认参数
function getinfo2(name:string,age:number=20):string{
    return `${name}--${age}`
}
console.log(getinfo2("aaa"))//输出aaa--20

可选参数这里和js完全不同,如果时可选参数必须用“?”标记出来,否则会报错。而在js中不传第二个参数时不会报错,第二个参数会默认为undefined。

3.剩余参数,“...”接收传过来的所有参数

function sum(...result:number[]):number{
    var sum=0
    for(var i=0;i<result.length;i++){
        sum+=result[i]
    }
    return sum
}
console.log(sum(1,2,3,4))//输出 10

4.解构用于函数声明

type C = { a: string, b?: number }
function f({ a, b }: C): void {
    console.log("a:",a,"b:",b)
}
f({a:"qwe"})//输出 a: qwe b: undefined

5.方法重载

function getInfo(name:string):string
function getInfo(name:string,age:number):string

function getInfo(name:string,age?:any):any{
    if(age){
        return "我叫:"+name+"我的年龄是:"+age
    }else{
        return "我叫:"+name
    }
}
console.log(getInfo("zhang"))//输出 我叫:zhang
console.log(getInfo("zhang",18))//输出  我叫:zhang我的年龄是:18
//console.log(getInfo(123)) 这样写是错误的

ES5中类

1.定义

function person(name,age){
            this.name=name
            this.age=age
            this.run=function(){
                console.log(this.name+'在运动')
            }
        }
        person.getinfo=function(){
            console.log("我是静态方法")
        }//定义静态方法

        //原型链上定义属性、方法
            
        person.prototype.sex="男"//原型链上属性会被多个实例共享
        person.prototype.work=function(){
            console.log(this.name+"在工作")
        }

        person.getinfo()//执行静态方法,输出	我是静态方法

        p=new person("zhang",18)
        p.run()//执行对象方法,输出	zhang在运动
        p.work()//执行原型链方法,输出	zhang在工作

2.继承

1)对象冒充实现继承

function web(name,age){
	person.call(this,name,age)//对象冒充实现继承
}
var w=new web("zhang",18)
w.run()//输出	zhang在运动
w.work()//报错,对象不支持work属性或方法

只可继承构造函数里的属性和方法,无法继承原型链里的属性和方法

2)原型链实现继承

function web(name,age){
            
}
web.prototype=new person("zhang",18)
var w=new web()
w.run()//输出	zhang在运动
w.work()//输出	zhang在工作

既可继承构造函数里的属性和方法,又可以继承原型链里的属性和方法。问题也很明显,实例化时子类无法给父类传参

3)对象冒充组合原型链实现继承

function web(name,age){
	person.call(this,name,age)
}
web.prototype=person.prototype
var w=new web("zhang",18)
w.run()//输出	zhang在运动
w.work()//输出	zhang在工作

既可继承构造函数里的属性和方法,又可以继承原型链里的属性和方法,解决原型链继承中的问题


TS中的类

1类的定义

class person{
    name:string
    constructor(name:string){
        this.name=name
    }
    run():void{
        console.log(`${this.name}在跑步`)
    }
}

var p=new person('zhang')
p.run()//输出	zhang在跑步

2类的继承

class worker extends person{
    constructor(name:string){
        super(name)
    }
    work():void{
        console.log(`${this.name}在工作`)
    }
}

var w=new worker('huan')
w.run()//输出	huan在跑步
w.work()//输出	huan在工作

3类的修饰符

public 公有,在类、子类里外都可访问

protected 保护型,在类、子类里可访问,在类外不可访问

private 私有型,在类里可访问,字类里、外都不可访问

4抽象类

abstract class animal{
    public name:string
    constructor(name:string){
        this.name=name
    }
    abstract eat():any//定义抽象方法,其字类必须实现该方法
}

class dog extends animal{
    constructor(name:string){
        super(name)
    }
    eat():any{
        console.log(`${this.name}在吃狗粮`)
    }
}

var d=new dog('小黑')
d.eat()//输出	小黑在吃狗粮

接口

为达到规范,定义的一种约束

1.约束

//对函数参数的约束
interface config{
    type:string;
    url:string;
    data?:string;
    dataType:string;
}
function ajax(config:config){
    var xhr=new XMLHttpRequest()
    xhr.open(config.type,config.url,true)
    xhr.send(config.data)
    xhr.onreadystatechange=function(){
        if(xhr.readyState==4&&xhr.status==200){
            console.log("success")
            if(config.dataType=='json'){
                console.log(JSON.parse(xhr.responseText))
            }else{
                console.log(xhr.responseText)
            }
        }
    }
}

ajax({
    type:'get',
    data:'name=zhang',
    url:'http://a.itying.com/api/productlist',
    dataType:'json'
})

//对函数的约束
interface encrypt{
    (key:string,value:string):string
}

var md5:encrypt=function(key:string,value:string):string{
    return key+value
}

console.log(md5('zhang','huan'))

//对数组的约束
interface userarr{
    [index:number]:string
}
var arr:userarr=['aaa','bbb']
console.log(arr[0])

//对对象的约束
interface userobj{
    [index:string]:string
}
var obj:userobj={
    name:'zhang'
}
console.log(obj.name)

//对类的约束
interface animal{
    name:string
    eat(str:string):void
}
class dog implements animal{
    name:string
    constructor(name:string){
        this.name=name
    }
    eat(){
        console.log(`${this.name}吃狗粮`)
    }
}
var xiaohei=new dog("小黑")
xiaohei.eat()

class cat implements animal{
    name:string
    constructor(name:string){
        this.name=name
    }
    eat(food:string){
        console.log(`${this.name}吃${food}`)
    }
}
var xiaohua=new cat("小花")
xiaohua.eat("耗子")

2继承

//官方文档的多继承例子
interface Shape {
    color: string;
}

interface PenStroke {
    penWidth: number;
}

interface Square extends Shape, PenStroke {
    sideLength: number;
}

let square = <Square>{};//实例化一个对象
square.color = "blue";
square.sideLength = 10;
square.penWidth = 5.0;

泛型

在定义函数、接口或类的时候,不预先设定其类型,而在调用时在指定类型

function go<T>(arg:T):T{
    console.log(arg)
    return arg
}
go('go,go,go……')//输出	gp,go,go……

装饰器

1修改tsconfig.json文件,使得VS支持装饰器功能

"experimentalDecorators": true,

2使用

//类装饰器
function logclass(params:any) {//params就是当前类
    params.prototype.apiurl="动态扩展属性"//给类扩展属性
    params.prototype.run=function(){//给类扩展方法
        console.log("这是扩展的run方法")
    }
}

@logclass
class httpclient{

}

var h:any=new httpclient()
console.log(h.apiurl)//输出	动态扩展属性
h.run()//输出	这是扩展的run方法

//装饰器工厂
function logclass(params:any) {//外部参数
    return function(target:any){//target是当前类
        console.log(params)
        console.log(target)
    }
}

@logclass("hello")//可传参
class httpclient{

}

var h=new httpclient()
//输出  hello
//输出  f httpclient() {
//    }

//装饰器修改类的构造函数
function logclass(params:any):any {
    return class extends params{
        constructor(){
            super(name)
            this.name="修改后的构造函数"
            console.log(this.name)
        }
    }
}

@logclass//可传参
class httpclient{
    name:string|undefined
    constructor(){
        this.name="修改前的构造函数"
        console.log(this.name)
    }
}

var h=new httpclient()
//输出  修改前的构造函数
//输出  修改后的构造函数

//属性装饰器
function logproperty(params:any){//params外部参数
    return function(target:any,attr:any){//target是原型对象,attr是对象的属性,这里会将修饰的属性自动传入
        console.log(target)
        console.log(attr)
        target[attr]=params
    }
}

class httpclient{
    @logproperty("xxx.com")
    name:string|undefined
    constructor(){
    }
}

var h=new httpclient()
console.log(h.name)
//输出  {constructor: ƒ}
//输出  name
//输出  xxx.com

//方法装饰器
//传入3个参数分别接收:类的原型对象、成员名字、成员属性描述符
function get(params:any):any {
    return function(target:any,methodname:any,desc:any){
        console.log(target)
        console.log(methodname)
        console.log(desc)
    }
}


class httpclient{
    name:string|undefined
    constructor(){
        this.name="zhanghuan.top"
        console.log(this.name)
    }
    @get("abcdefg")//放在方法上
    getdata(){
        console.log(this.name)
    }
}

var h=new httpclient()
//输出  {getdata: ƒ, constructor: ƒ}
//输出  getdata
//输出  {value: ƒ, writable: true, enumerable: true, configurable: true}
//输出  zhanghuan.top

3装饰器执行顺序

属性>方法>方法参数>类

标签:function,Typescript,console,name,31,2020,log,var,string
From: https://www.cnblogs.com/sylvesterzhang/p/18089840

相关文章

  • 2020-2-17-mongodb的使用
    下载地址、安装、启动服务、查看、创建数据库及表、新增数据、删除数据、更新数据、查询数据、索引下载地址http://dl.mongodb.org/dl/win32/x86_64下载名为mongodb-win32-x86_64-2012plus-v4.2-latest-signed.msi的文件安装点击下一步,跳过安装mangodb_compass启动服务mo......
  • 2020-3-1-jsonp原理
    原理ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,将数据作为参数,在src中进行了调用,这样实现了跨域。实现代码1服务端//nodejsvarhttp=require......
  • 2020-2-26-koa框架使用
    快速上手、路由、动态路由、获取get值、中间间、koa-views使用、ejs小结、利用中间体配置公共变量、获取post数据、静态web服务、koa-art-template使用、cookies使用、session使用、mongodb数据库封装、路由模块化案例、快速创建koa项目koa-generator快速上手1安装npminstall......
  • 2020-2-20-nodejs基础知识
    vs插件安装、快速运行、url模块使用、自动重启工具supervisor、自定义模块、下载第三方包、fs模块、Async、Await的使用、文件里、简易静态服务器、事件驱动EventEmitter、模拟登陆简单版、模拟express封装、操作mongodb数据库VScode插件安装需要安装NodeSnippets插件才会有提......
  • 2020-3-7-webpack打包工具
    概述、快速使用、配置文件、webpack-dev-server、babel使用概述为优化页面发送多次的二次请求导致加载速度变慢和处理错综复杂的文件依赖关系,则需要将项目中涉及的多个文件进行合并并重新构建。wepack是一个基于node.js项目构建工具,其构建方式是基于项目构建。安装npmiwebp......
  • 2020-5-11-Mybatis
    框架和架构、MyBatis概述、入门、增删改查操作、dao实现类增删改查、引用外部配置文件、配置实体类别名、注册指定包内的dao接口、动态sql、一对多查询、多对多查询、延迟加载、mybatis缓存、注解开发框架和架构1框架软件开发的一套解决方案,不同框架解决不同问题。框架中封装很......
  • 2020-5-5-JAVAWEB
    测试、反射、注解、Mysql、JDBC、Tomcat、servlet、HTTP、EL表达式、JSTL、Filter过滤器、代理模式、监听器、Redis、Maven测试1黑白盒测试黑盒测试:不需要写代码,给输入值,看程序能否给出期望的输出值白盒测试:需要写代码,关注程序具体执行流程2测试步骤1)定义测试类包名:cn.itca......
  • 2020-5-23-Spring
    简介、耦合、控制反转、依赖注入、注解方式反转控制和依赖注入、Spring整合Junit、银行转账案例、代理、AOP面向切面编程、JDBCTemplate简介1核心内容IOC反向控制、AOP面向切面编程2优势方便解耦,简化编程AOP编程支持声明式事务支持方便程序的测试方便集成各种优秀的框架......
  • 2020-1-1-GIT使用经验汇总
    Git安装、创建版本库、同步操作、分支管理、查看版本记录、远程仓库相关操作安装sudoapt-getinstallgit设置用户名和邮箱gitconfig--globaluser.name"yourname"gitconfig--globaluser.email"[email protected]"创建版本库1.创建目录mkdirlearniggitcdlearn......
  • 2020-1-3-ekyll安装使用
    jekyll是一个博客工具,将markdown文件生成静态网页,具有较好的迁移性。安装依赖包RubyRubyGemsNodeJsPython安装完成后重启电脑配置gem镜像$gemsources--addhttps://gems.ruby-china.com/--removehttps://rubygems.org/$gemsources-l安装jeckyll-pagination$g......