Ts入门| 青训营笔记

101 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

js是动态类型——执行时报错/弱类型语言——类型转换 ts是静态类型——编译时报错/弱类型语言

学习js/ts区别

基础类型

image.png

ts中接口类型首字母为大写的I

image.png

函数类型

image.png

ts函数重载

数组类型

image.png

ts补充类型

image.png

泛型——先不指定具体类型,在使用时在指定

image.png

image.png ——函数泛型,在函数前用<T>

type gatt = <T>(target:T)=>T[]

反省关键字

  1. extends——必须在xxx范围内
  2. number——默认类型

image.png

类型别名

type——定义一种类型,并且命名 as——类型断言 image.png

ts高级

联合/交叉类型

联合类型|: 表示一个值可以是几种类型之一 交叉类型&:多种类型叠加在一起成为一种类型,包含了所需的所有类型的特性

type IBookList = Array<{
    author: string;
} & ({
    type:'history';
    range: string;
} | {
    type:'story';
    theme:string;
})>

类型保护/类型守卫

类型保护:对输入参数类型进行判断 根据输入参数类型不同,访问联合类型时,仅能访问联合类型中的交集部分

类型守卫: 通过as进行类型断言,通过自定义函数判断

image.png 可以通过联合类型+类型保护进行自动类型推断 image.png

image.png

功能应用

web/node.js

web应用

  1. 配置webpack loader相关配置
  2. 配置tsconfig.js文件
  3. 运行webpack启动/打包
  4. loader处理ts文件时,进行编译和类型检查

补充知识点:ts开始学习

运行ts需

  1. 将ts文件编译成js tsc 文件名.ts
  2. 运行js文件 node 文件名.js

ts注意点:

  1. TypeScript 会忽略程序中出现的空格、制表符和换行符。
  2. ts区分大小写(与js相同)

ts类型

js有的:number string boolean undefined null bigint symbol 引用:object

ts:

标题类型
jsnumber stringboolean undefined null bigint symbol引用:object
tsany 数组 元组 enum枚举 void never联合类型

元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同 enum类型是对JavaScript标准数据类型的一个补充(使用枚举类型可以为一组数值赋予友好的名字 )

元祖数组区别 数组保证元素类型相同 元祖不用

如果数组声明时未设置类型,则会被认为是 any 类型,在初始化时根据第一个元素的类型来推断数组的类型。

类型断言

语法格式:

<类型>

或:

as 类型

类型推断

当类型没有给出时,TypeScript 编译器利用类型推断来推断类型。——赋值后此变量类型就确定了,赋值其他类型会

ts函数

  1. 可以对参数进行类型校验
  2. 设置可选参数——?——————js通过...arg进行多个参数获取
  3. 可以确定函数返回类型
  4. 可以函数重载————重载是方法名字相同,而参数不同,返回类型可以相同也可以不同。

函数重载

定义函数重载需要定义重载签名和一个实现签名。 重载签名定义函数的形参和返回类型,没有函数体。一个函数可以有多个重载签名(不可调用)

let suits = ["hearts", "spades", "clubs", "diamonds"];
// 定义重载签名
function greet(person: string): string;
function greet(persons: string[]): string[];
// 定义实现签名
function greet(person: unknown): unknown {
    if (typeof person === 'string') {
        return `Hello, ${person}!`;
    } else if (Array.isArray(person)) {
        return person.map(name => `Hello, ${name}!`);
    }
    throw new Error('Unable to greet');
}
console.log(greet(suits[0]));
console.log(greet(suits));

接口

  1. 接口是一系列抽象方法的声明,是一些方法特征的集合
  2. 类是对象的抽象,接口实方法的抽象 包括属性定义和方法定义
  3. 需要注意接口不能转换为 JavaScript。 它只是 TypeScript 的一部分。
var customer = { 
    firstName: "Tom", 
    lastName: "Hanks", 
    sayHi: function () { return "Hi there"; } 
};
  1. 通过接口设置数组的索引和存储值,索引可以为number或字符串
interface namelist { 
   [index:number]:string 
} 

interface ages { 
    [index:string]:number 
} 
var agelist:ages; 
// 类型正确 
agelist["runoob"] = 15

ts类

ts类有多态的特性——多个子类继承同一父类方法,重写后表现出不同效果

ts命名空间

命名空间定义了标识符的可见范围,一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中。 如果我们需要在外部可以调用 SomeNameSpaceName 中的类和接口,则需要在类和接口添加 export 关键字。

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

TypeScript 命名空间

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

假设这样一种情况,当一个班上有两个名叫小明的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的姓(王小明,李小明),或者他们父母的名字等等。

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

TypeScript 中命名空间使用 namespace 来定义,语法格式如下:

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

以上定义了一个命名空间 SomeNameSpaceName,如果我们需要在外部可以调用 SomeNameSpaceName 中的类和接口,则需要在类和接口添加 export 关键字。

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

SomeNameSpaceName.SomeClassName;

如果一个命名空间在一个单独的 TypeScript 文件中,则应使用三斜杠 /// 引用它,语法格式如下:

/// <reference path = "SomeFileName.ts" />

ts声明文件——帮助检验第三方库的类型

  1. 声明文件以 .d.ts 为后缀

  2. 声明文件或模块的语法格式如下:

declare module Module_Name {
}

TypeScript 引入声明文件语法格式:

/// <reference path = " runoob.d.ts" />

完结,撒花✿✿ヽ(°▽°)ノ✿