typescript 学习笔记

2023-01-02  本文已影响0人  squidbrother

一些概念知识点

  1. javascript设计之初,存在缺陷
typeof NaN // 'number'
0.1+0.2 // 0.30000000000000004
true==1 //true
9+'1'  //'91'
[]==0 // true
  1. javascript的更新迭代


    时间轴
  2. javascript与typescript的区别与联系

  1. 为什么一定要学习ts

typescript安装与解析

  1. 安装ts与基本配置
  1. 浏览器端解析ts文件
npm install -g typescript
tsc test.ts
//查看版本号
tsc -v
//初始化一个tsc配置文件(tsconfig.json)
tsc --init
{
    "compilerOptions":{
        //自动编译
        "watch": true,
        //删除编译后注释
        "removeComments": true,
        //编译目标版本
        "target": "es5"
    }
}
配置信息
配置信息-说明1
配置信息-说明2
  1. 类型声明文件的使用说明
    xxxx.d.ts 为 xxxx.js 的类型约束说明文件


    类型文件说明1
    类型文件说明2
  2. 服务端解析ts文件

npm i -g ts-node
ts-node test.ts

类型注解分类

  1. JS已有类型
    原始类型(基本类型): number,string,boolean,null,undefined,symbol
    对象类型(引用类型): object( 数组,函数,对象等)

  2. TS新增类型
    联合类型、自定义类型(类型别名)、接口、元祖、字面量类型、枚举、void、any等

类型注解 - (javascript已有类型)

  1. 原始类型(基础类型)
let num1: number = 6;
let name: string = '张三';
let isTrue: boolean = true;
  1. 对象类型(引用类型)
//方法名(): 返回值类型  --  sayFn(): string
let person: { name: string, age: number, sayFn(): string } = {
    name: '张三',
    age: 20,
    sayFn(){
        return '你好~';
    }
}

通过接口可以简化对象的书写

interface Person {
  name: string
  age: number
  sayFn(): string
}
let person: Person = {
    name: '张三',
    age: 20,
    sayFn(){
        return '你好~';
    }
}
//单一类型
let arr1: number[] = [1,2,3,4];
let arr2: string[] = ['张三','李四'];
let arr3: boolean[] = [true,false];
//联合类型,可以通过管道(|)将变量设置多种类型
let arr4: (number | string)[] = [10,'hello'];
// 参数类型为数字类型,返回值为字符串
function someFn(name: number):string{
    return '返回的是'+ name;
}
// 参数类型为数字类型,返回值为数字类型
function addFn1(num1: number,num2: number): number{
    return num1+num2;
}
// 书写方式2
const addFn2 = (num1: number,num2: number): number => {
    return num1+num2;
}
// 参数可选值
function mySlice(start?: number, end?: number){
  console.log('开始索引',start,'结束索引',end);
}
  1. class类
class Person {
  name: string
  age: number
  constructor(name: string,age: number){
    this.age = age;
    this.name = name;
  }
}
let P1 = new Person('张三',20);
console.log('类的使用: '+P1.name,P1.age);
class Countobj {
  x = 10
  y = 20
  //实例方法
  scaleFn(n: number): void{
     this.x*=n
     this.y*=n
  }
};

let P1 = new Countobj();
P1.scaleFn(2);
console.log(P1.x); //20
console.log(P1.y); //40
class Animal {
  move(){
    console.log('走~');
  }
};
class Dog extends Animal {
  say(){
    console.log('汪~');
  }
};
const Dog1 = new Dog();
console.log(Dog1.move() , Dog1.say());
//-- 公有的,类与实例都可以用
class Animal {
  public move(){
    console.log('走~');
  }
};

//-- 类与继承的类,里面都可使用,但是实例无法使用
class Animal {
  protected move(){
    console.log('走~');
  }
  say(){
    this.move(); //可以调用
    console.log('汪~');
  }
};
let Dog = new Animal();
Dog.move(); //报错,无法使用

//-- 只有自己的类能用,继承的子类,实例均无法使用
class Animal {
  private move(){
    console.log('走~');
  }
  say(){
    this.move(); //可以调用
    console.log('汪~');
  }
};

class Dog extends Animal {
  eat(){
    this.move(); //报错,无法使用
    console.log('吃~');
  }
};

let Dog = new Animal();
Dog.move(); //报错,无法使用
class Person {
  readonly age: number = 18
  constructor(age: number){
    this.age = age
  }
};
let Person1 = new Person(20); //报错:属性无法修改,因为类型为readonly
class Point { x:number, y:number }
class Point3D { x:number, y:number, z:number }
const p: Point = new Point3D()

类型注解 - (typescript新增类型)

  1. 类型推断

注:
如果不知道类型,可以通过鼠标放在变量名称上,利用VSCode的提示来查看类型;

情况1: 声明变量并初始化值

let age: number
age = 18;
//等同于 声明变量类型,赋值为18
let age = 18;

情况2: 根据函数参数和内部处理,判断返回值

function addFn(num1: number, num2: number){
  return num1+num2;
}
// 等同于
function addFn(num1: number, num2: number): number
  1. void、any、可选值、默认值
function hiFn(name: string):void{
    //函数没有返回值
    console.log(name);
};
let some: any;
some = 1;
some = '你好';
function showMes( name: string, sex: string='female',age?: number ){
  console.log('属性:', name, sex, age);
}
showMes('张三','male',15);  //-- 属性: 张三 male 15
showMes('李四');  //-- 属性: 李四 female undefined
  1. 类型别名 - (通过关键词'type'简化书写)
type myArray = (string | number)[];
let arr1: myArray = [1,'hello']
  1. 接口 - (通过关键词'interface'来描述对象类型,达到复用)
interface Person {
  name: string
  age: number
  say(): string
}
let person: Person = {
  name: '张三',
  age:20
  say(){
     return '你好~'
  }
}
  1. 类型别名与接口的区别与联系
interface Person {
  name: string
  age: number
  say(): string
};
type Person = {
  name: string
  age: number
  say(): string
};
  1. 通过关键词implements,实现类的类型注解
interface Say {
  say(): string
};
class Dog implements Say {
  name: string
  constructor(name: string){
    this.name = name;
  }
  say(){
    return '汪~';
  }
};
let Dog1 = new Dog('小黑');
console.log(Dog1.say()); //'汪~'
console.log(Dog1.name); //'小黑'
  1. 元祖
let position: number[] = [51.51,96.56];
//通过元祖,来明确声明有几个变量
//明确只有两个元素,类型为number
let position: number[number,number] = [51.51,96.56];
  1. 枚举 -- (推荐使用字面量类型+联合类型,这比枚举要直观、简洁、高效)
enum myList { up, down }
function showFn(name: myList){
    console.log(name)
};
console.log(showFn.up); //0
console.log(showFn.down); //1
enum myList { student1='zhangsan', student2='lisi' }
function showFn(name: myList){
    console.log(name)
};
showFn(myList.student1); //'zhangsan'
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];  // 'Green'
  1. 字面量类型 -- (推荐使用!)
function showFn(direction:'up' | 'down' | 'left' | 'right'){
  console.log(direction);
};
showFn('up'); //'up'
  1. 类型断言
//-- 将鼠标划入e,即可查看DOM具体类型 (如A标签的类型HTMLAnchorElement)
<input onChange={ e => {} } />
const aLink = document.getElementById('link') as HTMLAnchorElement;
const aLink = <HTMLAnchorElement>document.getElementById('link');
  1. 交叉类型
interface Person { name: string }
interface Contact { phone: number }
type PersonDetail = Person & Contact
let person1: PersonDetail = {
  name: '张三',
  phone: 13717777777
};
type PersonDetail = { 
  name: string
  phone: string
}
交叉类型
  1. 泛型
function showMes<Type>(value: Type): Type{
  return value;
};
//-- 调用
console.log( showMes<string>('你好') ); //你好
console.log( showMes<number>(100) ); //100
interface Length {
  length: number
};
function showMes<Type extends Length>(value:Type):Type{
  cosnole.log(value.length);
  return value;
};
showMes([1,2,3]); //参数数组,返回数组,拥有length属性
showMes('abcd'); //参数字符串,返回字符串,拥有length属性
showMes({ length:10, name:'张三’ }); //参数对象,返回对象,拥有length属性

泛型的类型变量可以有多个,并且类型变量之间可以约束


多个类型约束的泛型
  1. 泛型 - 索引类型签名


    索引类型签名
  2. 类型映射

type Props = { a: number; b: string; c: boolean }
type Type3 = { [ key in keyof Props ]: number }
//-- 解析后
type Type3 = {
  a: number
  b: number
  c: numner
}

实战使用ts

  1. 根据.js文件书写.d.ts文件


    规则描述书写
  2. 通过关键词‘declare’来区分js中已有的变量声明,表示仅为进行变量约束,而非重新定义变量


    规则描述书写
    规则描述书写-为独立文件,导出规则
    规则描述书写-为独立文件,导入规则
上一篇 下一篇

猜你喜欢

热点阅读