TypeScript学习笔记

345 阅读4分钟

TypeScript 基础类型

  • 元祖:已知元素数量和类型的数组,对应位置的类型需要相同
let x: [string, number];
x = ['Runoob', 1];    // 运行正常
x = [1, 'Runoob'];    // 报错
console.log(x[0]);    // 输出 Runoob
  • 枚举(enum):用于定义数值集合,生成双向的键值对(用key可以取value,用value可以取key)
//默认
enum Color {Red, Green, Blue}
//手动赋值
enum Color {
  Red = 33,
  Green = 22,
  Blue = 11
}
  • void:用于标识方法返回值的类型,表示该方法没有返回值
  • null:表示对象值缺失。
  • undefined:用于初始化变量为一个未定义的值,类似void
  • never:never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。通常表现为抛出异常或无法执行到终止点(例如无线循环)
let x: never;
x = (()=>{ throw new Error('exception')})();

function error(message: string): never {
    throw new Error(message);
}

function loop(): never {
    while (true) {}
}

keyof

将一个类型映射为它所有成员名称的联合类型(interface映射其对应的key,其余原生类型映射原型链上的key,如果不存在原型链则映射为never)

interface Person {
    name: string;
    age: number;
    location: string;
}
 
type K1 = keyof Person; // "name" | "age" | "location"
type K2 = keyof Person[];  // "length" | "push" | "pop" | "concat" | ...
type K3 = keyof { [x: string]: Person };  // string

interface

用于将数据结构抽象定义

基本用法

用于定义一个对象的key-value

interface IPerson { 
    firstName:string, 
    lastName:string, 
    sayHi: ()=>string 
} 

定义数组

//定义常规数组
interface namelist { 
   [index:number]:string 
} 
var list2:namelist = ["John",1,"Bran"] / 错误元素 1 不是 string 类型

//定义key为字符串的数组(有问题)
interface ages { 
   [index:string]:number 
} 
var agelist:ages; 
agelist["John"] = 15   // 正确 

定义函数

interface SetUser {
  (name: string, age: number): string
}
let b: SetUser = (name: string, age: number) => name

继承

使用extends可以继承一个或多个接口实例,typeinterface可以相互继承

与type的区别

interface 能够声明合并

interface User {
  name: string
  age: number
}

interface User {
  sex: string
}

/*
  User 接口为 {
    name: string
    age: number
    sex: string 
  }
  */

type

定义对象

type User = {
  name: string
  age: number
};

定义函数

type SetUser = (name: string, age: number) => string
let b: SetUser = (name: string, age: number) => name

继承

typeinterface可以相互继承

type Name = { 
  name: string; 
}
type User = Name & { age: number  };
与interface的区别
联合类型,元组
// 联合类型
interface Dog {
    wong();
}
interface Cat {
    miao();
}
 
type Pet = Dog | Cat
 
// 具体定义数组每个位置的类型
type PetList = [Dog, Pet]
typeof

获取实例的 类型进行赋值

// 当你想获取一个变量的类型时,使用 typeof
let div = document.createElement('div');
type B = typeof div
其他骚操作
  • 通过type定义函数,并动态约定入参的类型
type Callback<T> = (data: T) => void;  

interface A {
  name: string
}
let a: Callback<A> = data => {
  return data.name
}
type Dictionary<T1, T2> = (data1: T1, data2: T2) => string
type NameLookup = Dictionary<string, Person>;
  • 通过type定义元祖,并动态约定数据类型
interface A {
  name: string
}
type Pair<T> = [T, T]
let c: Pair<A> = [{ name: 'asd' }, { name: 'asd' }]
type Tree<T> = T | { left: Tree<T>, right: Tree<T> };

class

static 关键字

static定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。

访问控制修饰符

  • public(默认) : 公有,可以在任何地方被访问。可被子类继承并实例化
  • protected : 受保护,可以被其自身以及其子类和父类访问。可被子类继承,但不可被子类实例化
  • private : 私有,只能被其定义所在的类访问。无法被子类继承
  • static : 静态,只能通过类来访问。可被子类继承,并通过子类访问

get、set关键词

  • get:定义类中获取某个计算属性的方法
  • set:定义修改类中某个计算属性的方法
class Point {
  $x: number

  constructor(x = 0) {
    this.$x = +x
  }

  get x() {
    return this.$x
  }

  set x(value) {
    this.$x = +value
  }
}

类和接口

类可以实现接口,使用关键字 implements,并将 interest 字段作为类的属性使用。

interface ILoan {
  interest: number
  say: () => string
}

class AgriLoan implements ILoan {
  interest: number
  constructor(interest: number, rebate: number) {
    this.interest = interest
  }
  say() {
    return '123'
  }
}

namespace

namespace中定义并被export导出的变量,可以通过命名空间名称来访问

namespace a {
  export interface ISomeInterfaceName {
    name: string
  }
  export const qwe = 123123
  export class SomeClassName {}
}

namespace b {
  let name: a.ISomeInterfaceName = {
    name: 'asd'
  }
}

export default a

声明文件

如果要引入第三方库时,需要使用declare module Module_Name定义引入第三方库的api

现在使用第三方库的@type文件作为第三方库的api定义文件