typeScript与JS的差别,以及TS学习总结

9,805 阅读3分钟

1.TS与JS的区别

TS使基于JS之上的一种语言,它由微软公司开发,在前端领域已经变得越来越重要了。在我的个人理解中TS和JS的本质区别:
TS是强类型语言,而JS是一种弱类型语言(强类型和弱类型语言没有具体的定义,我认为他们的区别是TS无隐形转换,变量的类型不能随意改变)

2.TS基于JS基础上新增的类型定义

(1) 元组类型(tuple)

元组就是数组,但是在TS元组是形容可以容纳不同类型的数组

const mytuple = [10,"Hello","World","typeScript"]; 

(2) 枚举类型(enum)

枚举类型就是用于定义数值集合。

enum Jay {
    jay = 3,
    jin = 1,    
    xiaoJAY = 2
}

0,1,2是jay等key代表的值,如果不加数字那么他就会从0开始递增

enum Jay {
    jay,  //0
    jin,    //1
    xiaoJAY  //2
}

一般在项目声明常量时我们会经常用到枚举

(3) void类型(void)

用于标识函数方法返回值的类型,表示该方法没有返回值。

function hello(): void {
    alert("Hello Runoob");
}

(4) never类型(never)

never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。

let x: never;
let y: number;

// 运行错误,数字类型不能转为 never 类型
x = 123;

// 运行正确,never 类型可以赋值给 never类型
x = (()=>{ throw new Error('exception')})();

// 运行正确,never 类型可以赋值给 数字类型
y = (()=>{ throw new Error('exception')})();

// 返回值为 never 的函数可以是抛出异常的情况
function error(message: string): never {
    throw new Error(message);
}

// 返回值为 never 的函数可以是无法被执行到的终止点的情况
function loop(): never {
    while (true) {}
}

3.TS中的其他定义

(1) 接口(interface)

接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。

interface Person { 
    firstName:string, 
    lastName:string, 
    allName ?: string // ?代表着改属性在继承时可有可无
    sayHi: ()=>string 
}

// 继承接口的对象必须要拥有接口中的所有必须数据,不然会报错
const customer:Person = { 
    firstName:"Tom",
    lastName:"Hanks", 
    sayHi: ():string =>{return "Hi there"} 
}

interface namelist { 
   [index:string]:string  // 这样书写代表这可以接收任意字符串的参数
} 

//extends关键字
interface Person { 
   age:number 
} 
 
interface Musician extends Person { 
   instrument:string 
}

interface Person1 { 
    age:number 
 } 
  
interface Musician extends Person { 
    instrument:string 
}

// 需要age和instrument属性同时存在才不会报错
let drummer: Musician = {
    age: 10,
    instrument: 'jay'
}; 

(2) 命名空间(namespace)

命名空间一个最明确的目的就是解决重名问题。

命名空间定义了标识符的可见范围,一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中。

namespace SomeNameSpaceName { 
   export interface ISomeInterfaceName {      }  
   export class SomeClassName {      }  
}

要在另外一个命名空间调用语法格式为:

SomeNameSpaceName.SomeClassName;