Typescript学习笔记(1.0)

Posted mez_Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Typescript学习笔记(1.0)相关的知识,希望对你有一定的参考价值。

typescript是由微软开发的自由和开源的编程语言。

typescript是javascript的一个超集,就是说JavaScript的语法typescript全部支持,并且在JavaScript进行了扩充,并在JavaScript的基础上进行了变量、函数、返回值等类型限制。

首先,是安装typescript。因为他需要编译,需要首先安装Node.js。【安装nodejs进入官网下载msi文件点点点就可以安装,方式比较简单,不再介绍】

然后使用npm命令安装:npm i -g typescript

比较习惯的是这种安装方式,当然还有其他安装方式,这里就不再介绍。

创建第一个typescript文件

打开文本编辑器(记事本,vscode都可以),进行创建ts为后缀的文件:

/*
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2023-04-04 14:47:53
 * @LastEditors: Mei
 * @LastEditTime: 2023-04-04 14:52:20
 * @FilePath: \\vscode\\ts\\hello.ts
 * @Description: 
 * 
 * Copyright (c) 2023 by $git_name_email, All Rights Reserved. 
 */
console.log("mez,Hello!")
var a:string="123"

这里是ts文件,不能直接在浏览器看到结果,而是需要编译成js文件

在vscode的控制台进行编译,生成了js文件

 

 

在ts文件里,我们将a加入了类型注解:string表示为变量a的类型为字符串类型,如果我们改成其他类型,在ts文件里面就会报错。

 

在安装了中文语言包的vscode就会出现中文指示,简直不要太方便。

这里需要注意,虽然在ts文件中出现了报错信息,但是我们如果要强制进行编译执行,还是会生成js文件的。

 接口

在这里我们使用一个接口,它描述了具有firstName和lastName字段的对象。在typescript中,如果两个类型其内部结构兼容,那么这两种类型兼容。这使我们实现一个接口,仅仅只需必要的结构形状,而不必有明确的implements子句。

/*
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2023-04-04 14:47:53
 * @LastEditors: Mei
 * @LastEditTime: 2023-04-05 10:42:25
 * @FilePath: \\vscode\\ts\\hello.ts
 * @Description: 
 * 
 * Copyright (c) 2023 by $git_name_email, All Rights Reserved. 
 */
console.log("mez,Hello!")
var a:string="123"

function greeter(person:string)
    return 'Hello,'+person;

var user="mez";
document.body.innerhtml=greeter(user);

interface Person
    firstName:string;
    lastName:string;


function greeter2(person:Person)
    return "Hello, "+person.firstName+""+person.lastName;


var user2=firstName:"Mei",lastName:"EZ";
document.body.innerHTML=greeter2(user2)

最后,让我们最后一次使用类来继续开发demo。typescript支持新的JavaScript特性,像基于类的面向对象编程的支持。

在这里,我们创建一个具有构造函数和一些公共字段的Student类。

此外,在构造函数参数中使用public是一种简写形式,它将自动创建具有该名称的属性。

/*
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2023-04-04 14:47:53
 * @LastEditors: Mei
 * @LastEditTime: 2023-04-05 10:59:50
 * @FilePath: \\vscode\\ts\\hello.ts
 * @Description: 
 * 
 * Copyright (c) 2023 by $git_name_email, All Rights Reserved. 
 */
console.log("mez,Hello!")
var a:string="123"

function greeter(person:string)
    return 'Hello,'+person;

var user="mez";
document.body.innerHTML=greeter(user);

interface Person
    firstName:string;
    lastName:string;


function greeter2(person:Person)
    return "Hello, "+person.firstName+""+person.lastName;


var user2=firstName:"Mei",lastName:"EZ";
document.body.innerHTML=greeter2(user2)
//******************** 
class Student3
    fullName:string;
    constructor(public firstName,public middleInitial,public lastName)
        this.fullName=firstName+" "+middleInitial+" "+lastName;
    

interface Person3
    firstName:string;
    lastName:string;

function greeter3(person:Person)
    return "Hello," +person.firstName+" "+person.lastName;

var user3=new Student3("Zhangsan","L.",+"Lisi");
document.body.innerHTML=greeter3(user3);

运行typescript web应用程序

流程为:将ts文件编译成js文件,然后新建HTML文件,引入js文件

<!--
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2023-04-05 15:15:01
 * @LastEditors: Mei
 * @LastEditTime: 2023-04-05 15:15:23
 * @FilePath: \\vscode\\ts\\test.html
 * @Description: 
 * 
 * Copyright (c) 2023 by $git_name_email, All Rights Reserved. 
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="hello.js"></script>
</body>
</html>

 

typescript handbook 学习笔记4

概述

这是我学习typescript的笔记。写这个笔记的原因主要有2个,一个是熟悉相关的写法;另一个是理清其中一些晦涩的东西。供以后开发时参考,相信对其他人也有用。

学习typescript建议直接看中文文档英文文档。我是看的英文文档

typescript handbook 学习笔记3

基本使用

class Greeter {
    //只读,必须在声明的时候或者constructor里面初始化
    readonly greeting: string;
    //constructor里面的只读
    constructor(readonly message: string) {
        this.greeting = message;
    }
    greet() {
        return \'Hello, \' + this.greeting;
    }
}

class Greeter01 extends Greeter {
    constructor(message: string = \'everyone\') {super(message);}
    greet() {
        return \'hi, \' + this.greeting;
    }
}

let sam = new Greeter01(\'world\');
sam.greet();

public, private和protected

  1. public是默认的,如果不声明就是public。
  2. private指只能内部访问,不能被子类访问。
  3. protected指只能被内部或者子类的实例访问。

注意:

  1. 2个类相同,除了成员相同之外,private和protected的元素必须来自于同一处代码。
  2. 如果一个类的constructor被标记为protected,那么表示这个类不能被实例化,只能通过它生成子类,然后实例化子类。

存取器

存取器能够拦截并重写读写属性的操作,如果只有get没有set就会被认为是只读的。

let language = {
  log: [\'example\', \'test\'],
  set current(name) {
    this.log.push(name);
  },
  get current() {
    if (this.log.length === 0) {
        return undefined;
    } else {
        return this.log[this.log.length - 1];
    }
  }
}

language.current = \'EN\';
console.log(language.current);

静态属性和方法

在属性或方法前面加上static就是静态属性或方法了,实例属性或方法用this访问,静态属性或方法用类名来访问。

抽象类

抽象类和接口类似,只能被继承,不能被实例化,和接口不同的是,抽象类可以定义一些方法,这些方法可以被继承。

抽象类也有抽象属性,抽象属性和接口一样,一定要在子类中实现。

类当做接口使用

很好理解,看下面这段代码即可。

class Point {
    x: number;
    y: number;
}

interface Point3d extends Point {
    z: number;
}

let point3d: Point3d = {x: 1, y: 2, z: 3};

函数

简写形式和完整形式

由于编译的时候可以从简写形式推断出完整形式,所以推荐用简写形式。

//简写形式
function add(x: number, y: number): number {
    return x + y;
}
let myAdd = function(x: number, y: number): number { return x + y; };

//完整形式
let myAdd: (x: number, y: number) => number =
    function(x: number, y: number): number { return x + y; };

可选参数和默认参数

//可选参数
function buildName(firstName: string, lastName?: string) {
    return firstName + " " + lastName;
}
//默认参数
function buildName(firstName: string, lastName = "Smith") {
    return firstName + " " + lastName;
}

可选参数和默认参数的函数类型是相同的:(firstName: string, lastName?: string) => string。为了书写方便,默认参数写在后面比较好。

参数多的话也可以解构和展开,示例如下:

function buildName(firstName: string, ...restOfName: string[]) {
    return firstName + " " + restOfName.join(" ");
}

let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;

this

关于this的原理请看这里:理解js中的函数调用和this

如果遇到this报错,可以通过添加this: void或者this: 类名 来解决。

注意下面这种直接用等号的写法是一种实验性的写法,es6并不支持,只在es7上做了提案。但是typescript和react都对这种写法做了支持.

//用浏览器的审查元素运行,会报错
class Handler {
    onClickGood = () => { console.log(this); }
}

一般如果要用等号的话,我们需要写在constructor里面(注意要加this)。

//写在constructor里面
class Handler {
    constructor() {
        this.onClickGood = () => { console.log(this); }
    }
}

let myHandler = new Handler();
myHandler.onClickGood();

函数重载

看下面的例子,注意前2个才是函数重载,最后一个是函数声明。在编译的时候,会逐一判断函数类型,如果这2个都不符合,就会报错。

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
    // Check to see if we\'re working with an object/array
    // if so, they gave us the deck and we\'ll pick the card
    if (typeof x == "object") {
        let pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // Otherwise just let them pick the card
    else if (typeof x == "number") {
        let pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

以上是关于Typescript学习笔记(1.0)的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript语法基础

图书TypeScript实战指南

TypeScript教程学习笔记16篇(完结)

VS2015 - 更改 TypeScript 版本

TypeScript教程学习笔记(未完结)

typescript handbook 学习笔记4