TypeScript入门

吴龙淼 写于 2021-08-20

安装

国内镜像 npm config set registry https://registry.npm.taobao.org

npm npm install -g typescript

基础类型

any

let x: any = 1;    // 数字类型
x = 'I am who I am';    // 字符串类型
x = false;    // 布尔类型

number

let binaryLiteral: number = 0b1010; // 二进制
let octalLiteral: number = 0o744;    // 八进制
let decLiteral: number = 6;    // 十进制

string

let name: string = "Runoob";
let years: number = 5;
let words: string = `您好,今年是 ${ name } 发布 ${ years + 1} 周年`;

boolean

let flag: boolean = true;

[]

// 在元素类型后面加上[]
let arr: number[] = [1, 2];

// 或者使用数组泛型
let arr: Array<number> = [1, 2];

元组:数组内元素类型可以自定义

let x: [string, number];
x = ['Runoob', 1];    // 运行正常
x = [1, 'Runoob'];    // 报错
console.log(x[0]);    // 输出 Runoob

枚举 enum

enum Color {Red, Green, Blue};
let c: Color = Color.Blue;
console.log(c);    // 输出 2

void

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

object

unknown

null undefined

never

unknown

unknown 需要断言类型或者判断类型
never 表示不可能的类型

联合类型

通过管道( )将变量设置多种类型,赋值时可以根据设置的类型来赋值
var val:string|number
val = 12
console.log("数字为 "+ val)
val = "Runoob"
console.log("字符串为 " + val)

可选属性 ?
interface SquareConfig {
  color?: string;
  width?: number;
}

高级类型(type)

和 interface 功能类型,但是不能实现,接口不能声明联合类型

// 联合类型
type Methods = 'GET' | 'POST' | 'PUT' | 'DELETE'

// 交叉类型
type x = a & b

type a = {
  aa?:string | number
  cc:string
}
type b = {
  readonly bb?: string | number
  dd?: string
}

// 选中部分组成新类型 用于interface
type v = Pick<x, 'aa' | 'dd'>

// 排除部分组成新类型
type z = Omit<x, 'aa' | 'dd'>

// Partial属性全转化为可选
Partial<T>

// Required属性全转为必选
Required<T>

// 排除null undefined
NonNullable<T>

// Record创建一个对象类型k,t
Record<K, T>

// 排除type类型
Exclude<T, U>

// 提取type类型
Extract<T, U>

Array<keyof b>
type PropType<T, K extends keyof T> = T extends { [key in K]: infer U } ? U : never

// 类型推断,常用于类型提取
type Flatten<T> = T extends Array<infer U> ? Flatten<U> : T

泛型

类似于any,但是不会丢失信息

function loggingIdentity<T>(arg: T): T {
    console.log(arg.length);  // Error: T doesn't have .length
    return arg;
}
function loggingIdentity<T>(arg: Array<T>): Array<T> {
    console.log(arg.length);  // Array has a .length, so no more error
    return arg;
}

泛型接口
interface GenericIdentityFn {
    <T>(arg: T): T;
}
interface GenericIdentityFn<T> {
    (arg: T): T;
}
function identity<T>(arg: T): T {
    return arg;
}
let myIdentity: GenericIdentityFn = identity;

泛型类
class GenericNumber<T> {
   readonly zeroValue: T;
    add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

泛型约束
需要传入符合约束类型的值,必须包含必须的属性
interface Lengthwise {
    length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

类的扩展

private  只能在定义类内使用
protected 在派生类内可以使用(可继承)
public  默认值

extends
readonly
get
set
static
抽象类 abstract不同于接口,抽象类可以包含成员的实现细节

接口能用的地方类都能使用

接口

接口中我们可以将数组的索引值和元素设置为不同类型,索引值可以是数字或字符串

属性严格检查
只读属性 readonly
可选属性 ?
索引签名 [index:number || string]
实现 implements接口继承拥有私有或受保护的成员的类时,这个接口类型只能被这个类或其子类实现
继承 extends

命名空间

别名内部模块
namespace SomeNameSpaceName {
   export interface ISomeInterfaceName {      }
   export class SomeClassName {      }
}

起别名 import q = x.y.z
写声明文件 .d.ts

声明文件

// src/jQuery.d.ts
declare var jQuery: (selector: string) => any;

jQuery('#foo');


declare module Module_Name {
}

declare var 声明全局变量
declare function 声明全局方法
declare class 声明全局类
declare enum 声明全局枚举类型
declare namespace 声明全局对象(含有子属性)
interface 和 type 声明全局类型

const let 类型推断

const a = 1 // 则 a 的类型就为 1
const d = '2' // 则 a 的类型就是 '2'

// b 的类型为 number,c 的类型为 string,这是由于右侧得到的类型即为 (number | string)[]
const [b, c] = [1, '2']

// d.e 的 类型 为 number,d.f 的类型 为 string,因为常量对象的属性是可以进行操作的,类型推导也会发生在初始化成员(对象属性)的过程中
const d = {
    e: 1,
    f: '2'
}

let a = 1 // a 为 number 类型
let b = '2' // b 为 string 类型

断言 as

尽量避免使用as any 推荐as unknown

const a = {
    b: 1
}
const c = (params: { b: 1 }) => {}

c(a) // 报错:不能将类型“number”分配给类型“1”,在 b: 1 那一行最后加上 as const 即可解决

配置文件规则