TypeScript相关知识

133 阅读4分钟

TS的基本用法

安装TS

Node和浏览器不能直接运行TS,需要把TS转化成JS

  • 实现TS向JS的转变
1. npm i typescript -g     #全局安装TS

2. tsc -v      #查看版本

3. tsc index.ts   #编译ts文件生成js文件

4. node index.js  #执行js代码
  • 简化运行TS步骤 ts-node可以编译和执行ts文件
1. npm i -g ts-node     #全局安装ts-node包

2. ts-node index.ts      #将ts转化为js,然后运行js代码

TS基础类型

原始类型

number,string,boolean,undefined,null,symbol

冒号后面的内容叫:类型注解

let username: string = "张老师";
let age: number = 24;
let off:boolean = true;

数组类型

let arr: string[] = ['1'];
let arr1: (string | number | null | boolean)[] = [true, null, 2, 'wo', 1, 2, 3, 'uihguih'];
let arr2: [number, string] = [1, '1'];

元组

let position: [number,number] = [1,2]
  • 元组可以指定长度,类型

对象类型

let obj:{name:string,age:number}={name:'张三',age:22};
let obj2:{name:string,age:number}={name:'李四',age:24};

类型别名

相同的类型能重复使用

type my = { name: string; age: number };
type my1 = { name: string; age: number ;friends:my};
let obj: my = { name: '张三', age: 24 };
let obj1: my = { name: '李四', age: 28 };
let obj2:my1={name: '李四', age: 28,friends:{ name: '王五', age: 30 }};

函数类型

  • 给函数添加类型实际给参数和返回值添加类型
//普通函数
function fn (num1:number,num2:number):number{
    return num1+num2
}

//箭头函数
const fn1=(num1:number,num2:number):number => {
    return num1+num2
}

//同时指定参数和返回值类型
const fn3:(num1:number,num2:number)=>number=(num1,num2)=>{
    return num1+num2
}

//void类型,没有返回值
const fn4=function (username:string):void{
    console.log('hello'+username);
}

//可选参数
function myslice(start?:number,end?:number){
    console.log('起始索引',start,'索引结束',end);
}
myslice()
myslice(10)
myslice(10,20)

TS访问修饰符

  • private:在当前类中定义的属性和方法
  • protected:访问当前类和子类
  • public:当前类、子类和实例化对象
当前类子类实例化对象
private 私有可以
protected 受保护的可以可以
public 公开的可以可以可以

私有修饰符

  • 只能够在该类的内部进行访问,实例对象并不能够访问
class Father {
    private name :String
    constructor(name:String){
        this.name=name
    }
}

const father =new Father('huihui')
father.name

image.png

  • 继承该类的子类不能访问
class Father {
    private name :String
    constructor(name:String){
        this.name=name
    }
}

class Son extends Father{
    say(){
        console.log(`我的名字是${this.name}`);
    }
}

image.png

受保护修饰符

  • 跟私有修饰符很相似,实例对象同样不能访问受保护的属性
class Father {
    protected name :String
    constructor(name:String){
        this.name=name
    }
}

const father =new Father('huihui')
father.name

image.png

  • protected 成员在子类中仍然可以访问
class Father {
    protected name :String
    constructor(name:String){
        this.name=name
    }
}

class Son extends Father{
    say(){
        console.log(`我的名字是${this.name}`);
    }
}

public

  • 公开的在哪都能访问
class Father { 
    public name :String 
    constructor(name:String){ 
        this.name=name 
    }
} 
class Son extends Father{ 
    say(){
        console.log(`我的名字是${this.name}`);
    }
}

枚举类型

enum type {
    up = 1,
    down = 2,
    left = 3,
    right = 4
}

function choose(direct: type) {
    
}
choose(type.down)
type Direction = 1 | 2 | 3 | 4

function hand(direct: Direction) {

}

hand(1)
  • 默认从0自增也可以设定初始值然后依次自增

image.png

interface 接口

interface type {
    name: string
    address(): string
    run(): number
}

class Person implements type {
    name: string
    constructor(name: string) {
        this.name = name
    }

    address():string{
        return `${this.name}去北京`
    }

    run(){
        return 666
    }
}

let p1 = new Person('张三')
console.log(p1.address());

泛型

1. 多个泛型变量的情况

  • 泛型的类型变量可以有多个,并且类型变量之间还可以约束
function getData<T,k extends keyof T>(obj:T,key:k){
    return obj[key]
}
getData({name:'张三',age:18},'name')

2.泛型接口

  • 接口也可以配合泛型来使用,以增加其灵活性,增强其复用性
// 泛型接口
interface type<T> {
    id: (val: T) => T
    ids: () => T[]
}

let obj: type<number> = {
    id(val) {
        return 1
    },
    ids() {
        return [1, 2, 3]
    }
}

3.泛型数组

  • 实际上js的数组在ts上就是一个泛型接口

image.png

  • 当我们在使用数组时,TS会根据数组的不同类型,来自动将类型变量设置为相应的类型

4.泛型类

  • class也可以配合泛型来使用

实例化对象需要加类型

// 泛型类
class Person <T>{
    name:T
    say:(a:T,b:T)=>T
}

let P =new Person<number>()
P.name=1

实例化对象不需要加类型

class Person<T>{
    name: T
    say: (a: T, b: T) => T

    constructor(val: T) {
        this.name = val
    }
}
let P = new Person(100)
P.name=1

5.泛型工具类型

  • TS内置了一些常用的工具类型,来简化TS中的一些常见操作,他们都是基于泛型实现的
  1. Partial< Type >(可选类型)
  • 用来构造一个类型,将Type的所有属性设置为可选
interface Props {
    id: string
    children: number[]
}

type PropsType = Partial<Props>

let p1: Props = {
    id: '12',
    children: [1]
}

let p2: PropsType = {
    id: '12',
    children: [1,3]
}
  1. Readonly< Type >(只读类型)
  • 用来构造一个类型将Type的所有属性都设置为只读
interface Props {
    id: string
    children: number[]
}


type PropsType = Readonly<Props>
let p1: PropsType = {
    id: '12',
    children: [1, 3]
}

p1.id=12 //这里会报错 无法为 “id” 赋值,因为它是只读属性   
  1. Pick< Type,Keys >(从Type中选择一组属性来构造新类型)
interface Props {
    id: string
    title: string
    children: number[]
}

type PickProps = Pick<Props, 'id' | 'title'>

Pick工具类型有两个变量:1.选择谁的属性 2.选择哪几个属性

第二个类型变量传入的属性,只能是第一个变量中存在属性

头灶出来的PickProps,只有id和title两个属性类型

  1. Record< Keys,Type > (构造一个独享类型属性键为Keys,属性值为Type)
// 1.使用Record工具
type Recordobj = Record<'a'|'b'|'c',string[]>

// 2.使用传统方法
type Recordobj1={
    a:string[]
    b:number[]
    c:string[]
}

let obj :Recordobj1={
    a:['a'],
    b:[1],
    c:['c']
}