美文网首页
TypeScript

TypeScript

作者: 欢西西西 | 来源:发表于2022-06-08 18:04 被阅读0次

TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。

一、前置条件

  1. 安装:npm install -g typescript
  2. 编译成js的方式: tsc filename.ts
  3. 在vscode中运行js文件的方式:node filename.js

二、开始

1、基础类型与变量声明

注意一些新的类型:元组 Tuple、enum、any
以及一些略过的类型:void、never、null、undefined、类型断言

let isReal: boolean = false;

// null和undefined有一些特殊
let s: string = null;
let n: number = undefined;

// 将变量声明为数组类型的时候,也必须同时声明数组项的类型
let numArr: Array<number> = [1, 2, 3]; // 声明一个项为数字的数组
let numArr2: number[] = []; // 声明一个项为数字的数组
let list: Array<any> = []; // 声明一个项为未知类型或不同类型的数组
1.1 元组 Tuple:表示一个已知元素数量和类型的数组。下面这个x数组只应有2项,且每项的类型符合定义
let x: [string, number] = ['', 20];
1.2 枚举enum:既能根据key得到value,又能根据value得到key
enum stateNo { Working = 20, Finished = 30, Cancel = 92 };
let stateCancel: stateNo = stateNo.Cancel;
let stateName: string = stateNo[20];
1.3 any:当变量类型不确定时,如果一开始没有赋值,允许后续修改成不同的类型;但如果一开始赋过值,那么类型不允许修改。如果需要允许,则声明时使用any类型
let notSure; // 未赋值,后续可修改
notSure = "maybe a string instead";
notSure = false;
notSure = 20; 

let notSure: any = true; // 赋过值,但使用了any类型,后续也可修改
notSure = "maybe a string instead";
notSure = false;
notSure = 20; 

下图:未使用any,一开始赋过值,之后不应再修改类型


2、类型校验

2.1 函数入参校验
// 类型注解:为函数或变量添加约束的方式;则编译时会检查传入的参数的类型
function test1(person: string) {
    return "Hello, " + person;
}

如果传入的参数非字符串类型,或参数缺失,则会提示:


2.2 函数返回值校验
// 如果指定了函数返回值的类型,除了指定为void和any之外,其他类型都应该有返回值。
function getNumber(a: number, b: boolean): number {
    return;  // 直接return 或 return null也并不会报错
}

// 你也可以用void指明这个函数是没有返回值的
function test(a: number): void { 

}

3、接口

3.1 定义接口

// 声明一个Product类型

interface Product {
    name: string;
    sn: string;
    arr: [Number, string];
}

// 编译时会校验传进来的p是否符合:必须包含而且仅包含这3个字段。

function test2(p: Product) {
   
}
test2({ name: 'sd', sn: "User", arr: [20, ''] });

// 如果入参中的字段缺失,或者多传了字段,都会提示:



如果函数中使用了product类型中不存在的字段,也会提示:


3.2 可选字段

如果部分字段是可选的,可以使用?:来指定其类型

interface config {
    color: string;
    width?: number; // 则width可以不传
}
3.3 不可修改的字段

使用 readonly 来定义接口中的某个字段,使这个字段不可修改,类似于使用const声明变量的效果

interface config {
    readonly color: string;
    width?: number; // 则width可以不传
}

let c1: config = { color: 'red' }; // 此后color属性不能再修改了
3.4 字符串索引签名

多数时候,对象有多少属性并不是固定的。当你都不知道传进来的对象除了你想要的那几个属性之外,还有没有其他属性的时候,添加一个字符串索引签名 [propName: string]: any

interface SquareConfig {
    color: string;
    width?: number;
    [propName: string]: any;
}

let a: SquareConfig = {
    color: 'red',
    innerWidth: 98912, // 此时就可以带一些额外的属性了
    outerHeight: 982
}

4、类

注意 public 和 private 关键字

class Upload {
    uploadSrc
    constructor(public src) {
        this.uploadSrc = 'https://' + src;
        this.init(); // init方法声明为了private,只能在内部调用
        this.getFullsrc();
    }

    private init() {
        console.log('private init');
    }

    public getFullsrc() {
        console.log('public');
        return this.uploadSrc;
    }
}

// 由于init方法声明为了private,只能在内部调用,在实例中调用会提示:


image.png

// 实际上编译后的js文件中,用private和public修饰的原型方法并没有区别,仍能在实例上调用init方法,只是使用ts在编写时会有提示。编译后的js文件:



// 在构造函数的参数上使用public等同于创建了同名的属性:

相关文章

网友评论

      本文标题:TypeScript

      本文链接:https://www.haomeiwen.com/subject/iieumrtx.html