主页 > 软件开发  > 

TypeScript学习:初学

TypeScript学习:初学
安装等配置指令 安装TypeScript

npm i typescript -g

检查版本

tsc -v npx tsc -v

运行ts文件及js文件

npx tsc 文件名.ts node 文件名.js

安装ts-node脚手架

npm i ts-node -g

检查脚手架版本

npx ts-node -v

初始化ts状态

npx tsc -- init

使用脚手架运行ts文件

npx ts-node 文件名.ts

语法 类型注解

let 变量名:类型名 = 值

let age = 18->let age:number = 18

只能赋值相同类型

age = '张三' 报错:类型错误

其他基本数据类型

let name:name = '张三'

let isfalse:boolean = false

let un:undefined = undefined

数组写法

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

let arr:(string | number)[] = [1,2,3,'4']

let arr:Array<number | string> = [1,2,3,'4']

类型别名

type CustomPerson = Array<number | string | boolean>

let arr:CostomPerson = [1,'2',true]

函数类型  function add(a:number,b:number):number{   return a+b;  }  add(1,2)

return '1' 报错:因为要求返回的数据是number类型

add('1',2) 报错:因为要求传入的数据是number类型

键勾函数  const add = (a:number,b:number):number =>{   return a+b  } 可通过类型别名来同时指定  type CustomAdd = (a:number,b:number)=>number;  ​  const add:CustomAdd = (number1,number2)=>{   return number1+number2  } void类型

void函数在不需要返回值的时候使用

 function sayHi(str:string):void{   consolr.log(str)  } 可选参数

参数前加"?"表示可选参数

我不知道传入的参数,就把要求传入的参数改为可以传可以不传

必选参数不可以放在可选参数的后面

 function createPerson(name:string,age?:number):void{   console.log(`名字是${name},年龄为${age}`)  }  ​  createPerson('张三') 对象类型  let person :{   name:string   age:number   sayHi(str:string):void  }={   name : '张三',   age : 18,     sayHi(str){     console.log(`${str}`)     }  }  ​  person.sayHi('hello') 类型别名适用  type CostomPerson = {     name:string,     age:number,     sayHi(str:string):void  }  ​  let person:CostomPerson = {     name : '张三',     age : 18,     sayHi(str){         console.log(`${str}`)     }  }  ​  person.sayHi('hello') 键勾函数适用  type CostomPerson = {     name:string,     age:number,     sayHi:(str:string)=>void  }  ​  let person:CostomPerson = {     name : '张三',     age : 18,     sayHi(str){         console.log(`${str}`)     }  }  ​  person.sayHi('hello') 可选参数适用  type CostomPerson = {     name:string,     age:number,     hobby?:Array<string>,     sayHi(str:string):void  }  ​  let person:CostomPerson = {     name : '张三',     age : 18,     sayHi(str){         console.log(`${str}`)     }  }  ​  person.sayHi('hello') 接口

interface关键字来声明接口

 interface CustomPerson {   name:string   age:number  }  ​  let person:CustomPerson = {     name : '张三',     age : 18  } 继承  // 继承 继承另一个类型的所有属性  interface CustomPerson1 extends CustomPerson{     songs : string  }  let star:CustomPerson1 = {     name : 'aaa',     age : 19,     songs : '凤凰传奇'  } 元组  let position : [number,string] = [1,'1']  ​  // 类型推论,根据值反推出类型  let age = 18  // age = '111' 字面量类型

当类型别名被固定定义时,输入别的值就会报错

 {     let str = 'hello'     const str1 = 'hello'  ​     // 贪吃蛇游戏     type fangxiang = 'down' | 'up' | 'left' | 'right'     function move (driection:fangxiang){         console.log(driection)     }     move('down')     // move('aaa')  } 泛型

传入什么数据类型 返回什么数据类型

注册泛型函数,在变量名后加<type>,type为类型名

 function fn<type> (value:type):type{   return value  } 调用

声明什么类型,就要用到什么类型

let res = fn<number>(10)

let res = fn<string>('a')

一般能推断的函数类型,简化即可

let res = fn(2)

其他属性调用无效

泛型函数的类型变量 Type 可以代表多个类型,这导致无法访问任何属性

console.log(value.length) 报错:因为不认识length属性

添加约束

添加一个接口,使length属性可以被继承到定义的函数中

 interface havelength {     length : number  }  ​  function fn1<type extends havelength> (value:type):type{     console.log(value.length)     return value  }

在调用时,只用有length属性的,在调用时才不会报错

像数字无length属性的,就会报错

let res4 = fn1(2) 报错:因为数字无length属性

let res5 = fn1('abc')

let res6 = fn1([1,2,3,4,5])

多个类型变量

在传入一个对象与其对象之中的子属性时,一般情况下不能正常使用

这需要我们添加一个约束,让key的值始终在obj里面

 function getValue<Type,Key extends keyof Type>(obj:Type,key:Key){     return obj[key]  }  ​  getValue({name:'zs',age:18},'name')

在未限制对象之前,如果引用的第一个参数不符合条件,反而会在第二个参数报错,那么我们就要对第一个参数也进行约束

 // 继承js中object属性,使第一个参数满足object  function getValue1<Type extends object,Key extends keyof Type>(obj:Type,key:Key){     return obj[key]  }  // 这样在引入时就会报第一个参数的错误  // getValue1('aaa','b') 泛型接口

但我们在定义了一个固定类型的接口是,泛用性太差,因此我们就需要使用泛型接口在进行泛用

未运用泛型

 // 定义了一个接口  interface MyArray100 {     length : number     push(value:number):number     pop():number     reverse():number[]  }  ​  const arr100:MyArray100 = {     length:10,     push(n:number){         return 11     },     pop(){         return 10     },     reverse(){         return [1,2,3]     }  }  ​  arr100.push(10)

运用泛型

 // 定义一个存所有值的泛型接口  interface MyArray<Type> {     length : number     // 返回新的数组长度,所以不用改返回的number类型     push(value:Type):number     pop():Type     reverse():Type[]  }  ​  // 存数字  // 声明传入的类型  const arr:MyArray<number> = {     length:10,     push(n:number){         return 11     },     pop(){         return 10     },     reverse(){         return [1,2,3]     }  }  ​  arr.push(10)  ​  // 存字符串  ​  // 存布尔值  ​ 泛型工具类型  type Person = {     name : string,     age : number     hobby : string[]  }

可选

type p = Partial<Person>

只读

type p = Readonly<Person>

单个属性构造

type pickPerson = Pick<Person,'name' | 'age'>

索引签名类型  type Obj = {     [key : string] :number  }  ​  let test : Obj = {     x : 111,     y : 222  }  type Person = {     [k : string] : string | number  }  ​  let zs : Person = {     name : 'zs',     address : 'aaa',     email : 'aaa',     age : 18  }

标签:

TypeScript学习:初学由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“TypeScript学习:初学