一.Typescript的安装
1.npm/cnpm安装
npm install -g typescript
tsc -v
2.yarn安装
npm install -g yarn
yarn global add typescript
tsc -v
二.实现一个简单的'你好 ts'
1.目录结构

2.实现一个简单的'你好 ts'
console.log('你好 ts')
var str:string = "你好 ts"
3.ts变成js的手动输入命令
tsc index.ts
4.ts变成js的热更新配置
- 空白文件夹下输入:tsc --init(会自动生成一个tsconfig.json文件)
- 在tsconfig.json文件下,改outDir为outDir:'./js'
- 新建index.ts文件
let str:string = "你好 TS"
let str1:string = "你好啊"
- 点击终端——运行任务——typescript——tsc:监视-tscconfig.json
- 自动生成了index.js的目录结构

- 每次更改index.ts保存之后会自动更新到index.js里面
三.Typescript的类型介绍
1.布尔类型 (boolean) true false
var flag:boolean = true
flag = false
2.数字类型 (number)
var a:number = 123
console.log(a)
var b:number = 456.88
console.log(b)

3.字符串类型(string)
let str:string = "你好 TS"
console.log(str)
4.数组类型
let arr1:number[] = [1,2,3,4]
let arr2:string[] = ["1","2","3","4"]
let arr3:Array<number> = [11,22,33,44]
let arr4:Array<string> = ["11","22","33","44"]
5.元组类型(tuple) 属于数组的一种
let arr1:[string,number,boolean] = ['12',34,false]
let arr2:any[] = ['111',number,false]
6.枚举类型(enum)
enum Flag {success=1, error=-1}
var f:Flag = Flag.success
console.log(f)
7.任意类型(any)
var nums:any = 123
var oBox = document.getElement('box')
var oBox:any = document.getElement('box')
oBox.style.color = 'red'
8.null 和 undefined 其他 (never类型) 数据类型的子类型
var other1:undefined;
var other2:number | undefined;
var other3:null;
var other4 : number | null | undefined ;
9.void表示没有任何类型,一般用于定义方法的时候没有返回值
function run ():void {
console.log('run')
}
run()
10.never类型:是其他类型(包括null 和 undefined) 的子类型,代表从不会出现的值
var never1:undefined;
never1 = undefined
var never2:null;
never2 = null
var a:never;
a(()=>{
throw new Error('错误')
})()
四.Typescript中的函数
1.Typescript定义函数的两种方式
function run(): string {
return 'run'
}
run()
var run2 = function (): number {
return 123
}
run2()
2.Typescript定义传参的两种方式
function getinfo(name: string, age: number): string {
return `${name} --- ${age}`
}
getinfo('Typescript', 20)
var getinfo2 = function (name: string, age: number): string {
return `${name} --- ${age}`
}
getinfo2('Typescript', 200)
3.Typescript没有返回值的方法
function norun(): void {
console.log('run')
}
norun()
4.Typescript方法的可选参数
- ES5里面的方法的实参和形参可以不一样,但是TS中必须一样,如果不一样就需要配置可选参数
- 注意:可选参数必须配置到参数的最后面
function getinfo(name: string, age?: number): string {
if (age) {
return `${name} --- ${age}`
} else {
return `${name} --- 年龄保密`
}
}
alert(getinfo('Typescript'))
5.Typescript方法的默认参数
- ES5里面没法设置默认参数,ES6和TS都可以设置默认参数
function getinfo(name: string, age: number = 20): string {
return `${name} --- ${age}`
}
alert(getinfo('Typescript'))
alert(getinfo('Typescript', 30))
6.Typescript方法的剩余参数
function sum(a: number, b: number, c: number, d: number): number {
return a + b + c + d
}
alert(sum(1,2,3,4))
function sum(...result: number[]): number {
var sum = 0;
for (var i = 0; i < result.length; i++) {
sum += result[i]
}
return sum
}
alert(sum(1, 2, 3, 4, 5, 6))
function sum(a:number,...result: number[]): number {
var sum = a;
for (var i = 0; i < result.length; i++) {
sum += result[i]
}
return sum
}
alert(sum(1, 2, 3, 4, 5, 6))
7.Typescript方法的函数重载
- java中的方法的重载:重载指的是两个或者两个以上的同名函数,但是他们的参数不一样,这时会出现函数重载的情况
- ts中的重载:通过为同一个函数提供多个函数类型的定义来实现多种功能的目的
- ts为了兼容ES5以及ES6,重载的写法和java中有区别
function fun(config: any): any {}
function fun(config: any, value: any): any {}
function getinfo(name: string): string;
function getinfo(age: number): number;
function getinfo(str: any): any {
if (typeof str === 'string') {
return '我叫:' + str
} else {
return '我的年龄是:' + str
}
}
alert(getinfo('张三'))
alert(getinfo(20))
function getinfo(name: string): string;
function getinfo(name: string,age: number): string;
function getinfo(name: any,age?: any): any {
if(age) {
return '我叫:'+name +'----'+ '我的年龄:'+age
}else {
return '我叫:'+name
}
}
alert(getinfo('张三'))
alert(getinfo('TS重载',20))
8.Typescript方法的箭头函数
var fun = ((a:string,b:number):string => {
return a + b
})
alert(fun('箭头函数',6))
五.Typescript中的类
1.复习ES5里面的继承
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.work = function () {
console.log('我喜欢工作!!!')
}
function Fun(name, age, sex) {
Person.call(this, name, age)
this.sex = sex
}
Fun.prototype = new Person()
Fun.prototype.constructor = Fun
Fun.prototype.study = function () {
console.log('我喜欢学习!!!')
}
let tljx = new Fun('棠梨煎雪', 18, '女')
console.log(tljx)
tljx.work()
tljx.study()
2.复习ES6里面的继承
class Person {
constructor(name, age) {
this.name = name
this.age = age
}
work() {
console.log('我喜欢工作!!!')
}
}
class Fun extends Person {
constructor(name, age, sex) {
super(name, age)
this.sex = sex
}
study() {
console.log('我喜欢学习!!!')
}
}
let tljx = new Fun('棠梨煎雪', 18, '女')
console.log(tljx)
tljx.work()
tljx.study()
3.Typescript中的类
class Person {
name:string
constructor(name:string) {
this.name = name;
}
run():void {
alert(this.name)
}
}
var p = new Person('棠梨煎雪')
p.run()
class Person {
name:string
constructor(name:string) {
this.name = name;
}
getName():string {
return this.name
}
setName(name:string):void {
this.name = name
}
}
var p = new Person('棠梨煎雪')
alert(p.getName())
p.setName('Typescript')
alert(p.getName())
4.Typescript的继承
class Person {
name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age = age
}
work(): void {
console.log('我喜欢工作!!!')
}
}
class Fun extends Person {
sex: string
constructor(name: string, age: number, sex: string) {
super(name, age)
this.sex = sex
}
study(): void {
console.log('我喜欢学习!!!')
}
}
let tljx = new Fun('棠梨煎雪', 18, '女')
console.log(tljx)
tljx.work()
tljx.study()
5.Typescript的继承探讨
- 父类的方法和子类的方法一致,那么是会用父类,还是子类呢?
class Person {
name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age = age
}
work(): void {
console.log('我喜欢工作!!!')
}
}
class Fun extends Person {
sex: string
constructor(name: string, age: number, sex: string) {
super(name, age)
this.sex = sex
}
work(): void {
console.log('我喜欢学习!!!')
}
}
let tljx = new Fun('棠梨煎雪', 18, '女')
console.log(tljx)
tljx.work()
6.Typescript类里面的修饰符
- Typescript里面定义属性的时候,给我们提供了以下三种修饰符
- public:共有,在类里面,子类,和类外面都可以访问
- protected:保护类型,在类里面,子类里面可以访问,在类的外部没法访问
- private:私有,在类的里面可以访问,子类,类外部都没法访问
- 属性不加修饰符,默认是共有public
7.Typescript类静态方法
class Person {
name: string
age: number
static sex="女"
constructor(name: string, age: number) {
this.name = name
this.age = age
}
static work(): void {
console.log('我喜欢工作!!!')
console.log('我喜欢工作!!!' + Person.sex)
}
}
let tljx = new Person('棠梨煎雪', 18)
console.log(tljx)
tljx.work()
8.Typescript的多态方法
- 父类定义一个方法不去实现,让继承他的子类去实现,每一个子类有不同的表现
- 多态属于继承
9.Typescript的抽象方法
- Typescript中的抽象类,它是提供其他类继承的基类,不能直接被实例化
- 用abstract关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
- abstract抽象方法只能放在抽象类里面
- 抽象类和抽象方法用来定义标准
- 抽象类不能被实例化
abstract class Person {
name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age = age
}
abstract eat(): any;
}
class Dog extends Person {
constructor(name: string, age: number){
super(name,age)
}
eat(): any {
console.log(this.name + '爱吃饭')
}
}
var dog = new Dog('wangwang',12)
dog.eat()
六.Typescript中的接口
1.属性类接口
interface nameJson {
firstName: string;
secondName: string
}
function printName(name: nameJson): void {
console.log(name.firstName + '-------' + name.secondName)
}
printName({
firstName: '棠梨',
secondName: '煎雪'
})
var obj = {
obj: 20,
firstName: '棠梨',
secondName: '煎雪'
}
printName(obj)
2.可选属性接口
interface nameJson {
firstName: string;
secondName?: string
}
function printName(name: nameJson){
console.log(name)
}
printName({
firstName: '棠梨',
})
3.属性接口原生AJAX封装
interface Config {
type: string;
url: string;
data?: string;
dataType: string
}
function ajax(config: Config) {
var xhr = new XMLHttpRequest();
xhr.open(config.type, config.url, true)
xhr.send(config.data)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log("成功")
if (config.dataType === 'json') {
JSON.parse(xhr.responseText)
} else {
console.log(xhr.responseText)
}
}
}
}
ajax({
type: 'get',
url: 'https://www.baidu.com/',
data: '111',
dataType: 'json'
})
4.函数类型接口
- 对方法传入的参数,以及返回值进行约束
- 加密的函数类型接口
interface encrypt {
(key:string,value:string):string
}
var md5:encrypt = function(key:string,value:string):string{
return key+value;
}
console.log(md5('name','棠梨煎雪'))
5.可索引接口(数组、对象的约束,不常用)
interface Arr {
[index: number]: string
}
var arr: Arr = ['棠梨煎雪', '1234']
console.log(arr[1])
interface Obj {
[index:string]:string
}
var obj:Obj={name:'棠梨煎雪',age:'18'}
console.log(obj)
6.类类型接口(对类的约束,和抽象类有点相似)
interface Animal {
name: string;
eat(str: string): void
}
class Dog implements Animal {
name: string;
constructor(name: string) {
this.name = name
}
eat() {
console.log(this.name + '吃饭饭')
}
}
var p = new Dog('汪汪')
p.eat()
7.接口的拓展(接口可以继承接口)
interface Animal{
eat():void;
}
interface Dog extends Animal {
work():void
}
class Cat implements Dog {
public name:string;
constructor(name:string){
this.name = name
}
eat () {
console.log(this.name + '吃饭饭')
}
work () {
console.log(this.name + '爱工作')
}
}
var p = new Cat('小白')
p.eat()
p.work()
class Cat extends Parent implements Dog {}
七.Typescript中的泛型
1.泛型的理解
- 泛型就是解决类,接口方法的复用性,以及对不特定数据类型的支持
2.泛型的类型
function getDate(value:string):string {
return value;
}
function getDate(value:any):any {
return value;
}
function getData<T>(value:T):T {
return value
}
console.log(getData<number>(123))
- 泛型类:比如有个最小的堆算法,需要同时支持返回数字和字符串两种类型
class minNumber {
public list: number[] = [];
add(num: number) {
this.list.push(num)
}
min():number {
var minNum = this.list[0]
for (var i = 0; i < this.list.length; i++) {
if (minNum > this.list[i]) {
minNum = this.list[i]
}
}
return minNum;
}
}
var p = new minNumber()
p.add(2)
p.add(123)
p.add(1)
alert(p.min())
class minNumber<T> {
public list: T[] = [];
add(num: T): void {
this.list.push(num)
}
min(): T {
var minNum = this.list[0]
for (var i = 0; i < this.list.length; i++) {
if (minNum > this.list[i]) {
minNum = this.list[i]
}
}
return minNum;
}
}
var p1 = new minNumber<number>()
p1.add(2)
p1.add(123)
p1.add(1111)
alert(p1.min())
var p2 = new minNumber<string>()
p2.add('2')
p2.add('123')
p2.add('1111')
alert(p2.min())
3.泛型的接口
interface Config {
(value1:string,value2:string):string
}
var setData:Config = function(value1:string,value2:string):string {
return value1+value2
}
console.log(setData('棠梨','煎雪'))
interface Config {
<T>(value: T): T
}
var setData: Config = function <T>(value: T): T {
return value
}
console.log(setData('棠梨煎雪'))
interface Config<T> {
(value: T): T
}
function setData<T>(value: T): T {
return value
}
var mysetData:Config<string> = setData
console.log(mysetData('棠梨煎雪'))
4.泛型类:把类作为参数的泛型类(约束)
class User {
username: string | undefined;
password: string | undefined
}
class MysqlDb {
add(user: User): boolean {
console.log(user)
return true
}
}
var u = new User()
u.username = "棠梨煎雪"
u.password = "123"
var s = new MysqlDb()
s.add(u)
class User{
username: string | undefined;
password: string | undefined;
constructor(params:{
username: string | undefined;
password: string | undefined;
}){
this.username = params.username
this.password = params.password
}
}
var u = new User({
username:'棠梨煎雪',
password:'123456'
})
class MysqlDb<T> {
add(user: T): boolean {
console.log(user)
return true
}
}
var s = new MysqlDb<User>()
s.add(u)
八.Typescript类型,接口,类,泛型的综合应用
interface User<T> {
add(info: T): boolean;
update(info: T, id: number): boolean;
delete(id: number): boolean;
get(id: number): any[];
}
class MysqlDb<T> implements User<T>{
add(info: T): boolean {
console.log(info)
return true
}
update(info: T, id: number): boolean {
throw new Error("Method not implemented.");
}
delete(id: number): boolean {
throw new Error("Method not implemented.");
}
get(id: number): any[] {
throw new Error("Method not implemented.");
}
}
class MssqlDb<T> implements User<T>{
add(info: T): boolean {
throw new Error("Method not implemented.");
}
update(info: T, id: number): boolean {
throw new Error("Method not implemented.");
}
delete(id: number): boolean {
throw new Error("Method not implemented.");
}
get(id: number): any[] {
throw new Error("Method not implemented.");
}
}
class MongoDbDb<T> implements User<T>{
add(info: T): boolean {
throw new Error("Method not implemented.");
}
update(info: T, id: number): boolean {
throw new Error("Method not implemented.");
}
delete(id: number): boolean {
throw new Error("Method not implemented.");
}
get(id: number): any[] {
throw new Error("Method not implemented.");
}
}
class UserDb{
username:string | undefined;
password:string | undefined
}
var u = new UserDb()
u.username = "棠梨煎雪"
u.password="666666"
var oMysql = new MysqlDb<UserDb>()
oMysql.add(u)