深入理解TS | 青训营

156 阅读4分钟

一.什么是TS(TypeScript)

是一种由微软开发的开源编程语言,它是 JavaScript 的超集,能够为 JavaScript 添加静态类型检查和面向对象编程的特性。TS 可以在编译时进行类型检查,从而提高代码的可读性、可维护性和可靠性,同时还支持 ECMAScript 的最新特性。TS 可以运行在任何支持 JavaScript 的平台上,并且可以与现有的 JavaScript 代码无缝集成。TS 还具有良好的开发工具支持,例如 Visual Studio Code、WebStorm 等常用的 IDE 都支持 TS 的开发。

TS也可以称为JS的超集,即JS能做到的TS可以做到,JS做不到的TS也可以做到。

  • TS与JS的区别

image.png

二.TS基础类型

1.布尔型(Boolean)

最基本的数据类型,只有简单的true和flase两个值。

let isLogin: boolean = false;
// 编译通过
// 后面约定,未强调编译错误的代码片段,默认为编译通过
 
let isLogin2: boolean = new Boolean(1);
//编译报错
//使用构造函数 Boolean 创造的对象不是布尔值

2.数字(number)

和JS一样,TS中的所有数字都是浮点数,类型都是number

let n1: number = 6;
let n2: number = 0xf00d;// ES6 中的十六进制表示法,会被编译为十进制数字
let n3: number = 0b1010;// ES6 中的二进制表示法,会被编译为十进制数字
let n4: number = 0o744;// ES6 中的八进制表示法,会被编译为十进制数字
let n5: number = NaN;
let n6: number = Infinity;

3.字符串(string)

使用 string表示文本数据类型。 和JS一样,可以使用双引号( ")、单引号(')和反引号(`)表示字符串

let name: string
name = '234'

4.数组和元组(Turple)

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为 stringnumber类型的元组。

// 数组
let arr5:number[]
arr5 = [23,23,4]

// 元组
// 定义了两个number,那么arr6数组只能有两个元素
let arr6:[number,number]
arr6 = [234,235]
 

5.对象(Object)

let p1:object;//非基础类型,引用类型
p1={name:"karen",age:23}  //{name:"karen",age:23}
p1=[10,20,320]//数组也是特殊的对象 -->打印[10,20,320]
p1={name:'jack',age:18,color:"red"} //{name:'jack',age:18,color:"red"}
// p1="hello" //报错
console.log(p1)
 
let p2:Object;
p2=[10,20]
console.log(p2);//[10,20]

三.TS函数类型

  • 定义:TS定义函数类型时要定义输入参数类型和输出类型
  • 输入参数:参数支持可选参数和默认参数
  • 输出参数:输出可以自动推断,没有返回值时,默认为void类型
  • 函数重载:名称相同但参数不同,可以通过重载支持多种类型
function add(x: number[]):number
function add(x: string[]):string
function add(x: any[]): any{
    if (typeof x[0] === 'string'){
      return x.join()
    
   }
   if (typeof x[0] === 'number'){
       return x.reduce((acc,cur)=> acc+cur)
       }
   }

四.TS接口

定义:接口是为了定义对象类型 特点:

  • 可选属性:?
  • 只读属性:readonly
  • 可以描述函数类型
  • 可以描述自定义类型 总结:接口非常灵活duck typing
  interface Person{
      name: string;
      sayHello():void;
  }
  
  function fn(per: Person){
      per.sayHello();
  }
  
  fn({name:'xxx', sayHello() {console.log(`Hello, 我是 ${this.name}`)}});

五.TS类

定义:写法和JS差不多,增加了一些定义 特点:

  • 增加了public、private、protected修饰符
  • 抽象类:
    • 只能被继承,不能被实例化
    • 作为基类,抽象方法必须被子类实现
  • interface约束类,使用implements关键字
class Person {
    name: string
    age: number
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    say() {
        console.log(`年龄为${this.age}${this.name}say`)
    }
}
let person: Person = new Person('张三', 18);
person.say()

六.TS 的优缺点

1.优点

  • 灵活:可以将代码自动转换为js代码
  • 兼容性强: 可以在任何浏览器和操作系统运行,并不需要浏览器的支持,通过node.js运行即可
  • 方便维护: 在ts中的报错在编译时就能发现,不会直接显示到用户页面

2.缺点

  • 不利于前端工程师上手,需要理解接口,枚举等类型的概念
  • 需要多写一些类型的定义
  • 工作量大,和一些库不能完美结合

七. TS声明文件

  • declare:三方库需要类型声明文件
  • .d.ts:声明文件定义
  • @types:三方库TS类型包
  • tsconfig.json:定义TS的配置

TS可以规范我们的代码,编译阶段发现错误,在原生JS基础上加了一层定义;
ts是js的类型化超集,支持所有js,并在此基础上添加静态类型和面向对象思想。
静态类型,定义之后就不能改变。