ts[自用]

97 阅读2分钟

TypeScript 基础类型

Boolean 类型

Number 类型

String 类型

Enum 类型

undefined和null

any 类型

void 类型

无效的 undefinded

never 类型

用不存在的值

TypeScript 复杂类型

object、Object 、{} 类型

  • object
let obj:object;
obj = {}; // 正确
obj = 1;  // 错误 
obj = 2;  // 错误
  • Object、{}

所有原始类型、非原始类型都可以赋给 Object

let obj:Object;
// 以下都正确
obj = 1; ;
obj = 'abc';
obj = 'true'; 
obj = {};

class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  sayHi(): void {
    console.log(`Hi, ${this.name}`);
  }
}

Array 类型

const flag1: number[] = [1, 2, 3]; 
const flag2: Array<number> = [1, 2, 3];

Tuple类型

表示一个已知数量和类型的数组,可以理解为他是一种特殊的数组

const tuple: [number, string] = [1, "zhangmazi"];

函数

function add(x: number, y: number): number { return x + y; }

可选参数

function add(x: number, y?: number): number { return x + y; }

默认参数

function add(x: number, y: number=1): number { return x + y; }

剩余参数

function add(...number:[]): number { return x + y; }

函数重载

function add(x: number, y: number): number;
function add(x: string, y: string): string; 
function add(x: any, y: any): any { return x + y; }

联合类型

let stats: string | number;
stats = "to be or not to be";
stats = 1;

交叉类型

interface IpersonA {
  name: string;
  age: number;
}
interface IpersonB {
  name: string;
  gender: string;
}
let person: IpersonA & IpersonB ;
person = { name: "师爷", age: 18, gender: "男" };

如果key相同但是类型不同,则该key为never类型

interface IpersonA { name: string }
interface IpersonB { name: number } 
function testAndFn(params: IpersonA & IpersonB) { console.log(params) }
testAndFn({name: "黄老爷"}) 
// error TS2322: Type 'string' is not assignable to type 'never'.

接口

接口用来定义对象的类型。 接口是对象的状态(属性)和行为(方法)的抽象(描述)

使用关键字interface来声明接口

interface Person { name: string; age: number; } 
let tom: Person = { name: 'Tom', age: 25 };

设置接口可选或者只读

只读限制只能在对象刚刚创建的时候修改其值

interface Person { readonly name: string; age?: number; }

索引签名

希望一个接口中除了包含必选和可选属性之外,还允许有其他的任意属

一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集

interface Person { 
name: string; 
age?: number; 
[prop: string]: any; 
// prop字段必须是 string类型 or number类型。 值是any类型,也就是任意的 
}

类型别名

type count = number | number[];
function hello(value: count) {}

接口、类型别名在对象上的扩展

接口

interface MyInterface {
  name: string;
  say(): void;
}

interface MyInterface2 extends MyInterface {
  sex: string;
}

let person: MyInterface2 = {
  name: "树哥",
  sex: "男",
  say(): void {
    console.log("hello 啊,树哥!");
  },
};

类型别名

type MyType = {
  name: string;
  say(): void;
};
type MyType2 = MyType & {
  sex: string;
};
let value: MyType2 = {
  name: "树哥",
  sex: "男",
  say(): void {
    console.log("hello 啊,树哥!");
  },
};