typescript整理

5 篇文章 0 订阅
1 篇文章 0 订阅

联合类型——接口

1. 联合类型

let muchType: string | number = 'hello';
muchType = 10;
console.log(muchType.toString()); //这里需要使用定义类型共用的方法

2. 接口定义 强约束

一般首字母大写,有的编程语言建议加上 I 做开头

interface Istate {
  name: string;
  age: number;
}
let obj: Istate = { name: 'zhangsan', age: 20 };

3. 可选属性

interface Istate2 {
  name: string;
  age?: number; //存疑 可有可无
}
let obj2: Istate2;
obj2 = {
  name: '张三',
  age: 10,
};
obj2 = { name: '里斯' };

4. 属性个数不确定的时候 类型必须是any类型

interface Istate3 {
  name: string;
  age: number;
  [propName: string]: any; //propName为形参
}
let obj3: Istate3;
obj3 = { name: '张三', age: 20, sex: 'nan', isMarry: false };

5. 只读类型

interface Istate4 {
  name: string;
  readonly age: number;
}
let obj4: Istate4;
obj4 = { name: 'zhangsan', age: 20 };
obj4.name = 'lisi';
// obj4.age=10 //报错 只读

数组类型

1. 类型+方括号

let arr: number[] = [1, 2, 3];
let arr2: string[] = ['1', '2', '3'];
let arr3: any[] = [1, '2', true];

2. 采用数组泛型 array <elemType> 表示法

let arrType: Array<number> = [1, 2, 3];
let arrType2: Array<string> = ['1', '2', '3'];
let arrType3: Array<any> = [1, '2', true];

3. 接口表示法

interface Istate {
  name: string;
  age: number;
}

interface IArr {
  [index: number]: Istate; //index为形参
}

let arrType4: IArr = [{ name: 'shang', age: 19 }];
let arrType5: Array<Istate> = [{ name: 'shang', age: 19 }];
let arrType6: Istate[] = [{ name: 'shang', age: 19 }];

函数类型

1. 声明式类型的函数

function funcType(name: string, age: number): number /* 函数的返回值类型*/ {
  return age;
}
let ageNum: number = funcType('zhansan', 19);

2. 函数参数不确定

function funcType2(name: string, age: number, sex?: string): number {
  return age;
}
let ageNum2: number = funcType2('lisi', 18, 'nan');

3. 函数参数的默认值

function funcTypt3(name: string = 'zhangsan', age: number = 18): number {
  return age;
}

4. 表达式类型的函数

let funcType4 = function (name: string, age: number): number {
  return age;
};

let funcType5: (name: string, age: number) => number = function (
  name: string,
  age: number,
): number {
  return age;
};

interface funcType6 {
  (name: string, age: number): number;
}
let funcType6: funcType6 = function (name: string, age: number): number {
  return age;
};

5. 对于联合类型的函数,可以采用重载的方式

输入是string类型,输出也是string类型
输入是number类型,输出也是number类型

function getValue(value: string): string;
function getValue(value: number): number;
function getValue(value: string | number): string | number {
  return value;
}
let a: string = getValue('1');
let b: number = getValue(1);

类型断言

// let num: string | number = '10';
// num = 20;
// console.log(num.length); //类型“number”上面不存在“length”

1. 类型断言 只能断言联合类型中存在的类型

function getAssert(name: string | number) {
  // 可以用“<类型>”值或者 “值as类型”,但是在jsx语法中只能用“值as类型”
  // return (<string>name).length;
  return (name as string).length;
}

类型别名

1. 类型别名

type strType = string | number | boolean;
let str: strType = '10';
let str1: strType = 10;
let str3: strType = true;

2. 对于接口采用类型别名

interface muchType1 {
  name: string;
}
interface muchType2 {
  name: number;
}
type muchType = muchType1 | muchType2;
let much = { name: 'zhangsan' };
let much2 = { name: 1 };

3. 限制字符串的选择

type sex = 'nan' | 'nv';
function getSex(s: sex): string {
  return s;
}
getSex('nan');

枚举

1.使用枚举定义一些有名字的数据常量

enum Days {
  Sun = 10,
  Mon,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat,
}

console.log(Days.Sun); //10
console.log(Days.Sat); //16

console.log(Days); //枚举类型会被编译成一个双向印射的对象
console.log(Days[10] === 'Sun'); //true

类修饰符

创建Person类

export class Person {
  private name = 'zhangsan';
  protected age = 18;
  sex = 'nan';
  say() {
    console.log('my name ' + this.name + ', my age ' + this.age);
  }
}
let p = new Person(); //当类成员变量没有修饰的时候,默认是public修饰
p.say(); //my name zhangsan, my age 18

//private 私有属性只能在类的内部进行访问
// console.log(p.name); //属性“name”为私有属性,只能在类“Person”中访问。

//protected 保护属性只能在类的内部进行访问
// console.log(p.age); //属性“age”受保护,只能在类“Person”及其子类中访问。

创建Child子类

export class Child extends Person {
  callParsent() {
    super.say(); //super关键字可以获取到父类原型链上的方法
  }
  static test() {
    console.log('test');
  }
}
let c = new Child();
c.callParsent(); //my name zhangsan, my age 18

//子类继承了父类,但是无法获取父类私有或受保护的属性
// console.log(c.name);//属性“name”为私有属性,只能在类“Person”中访问。
// console.log(c.age);//属性“age”为私有属性,只能在类“person”中访问。

//子类继承了父类,子类就可以访问到父类公开的方法了
console.log(c.sex); //nan

Child.test(); //类的静态方法上面,不允许使用this

泛型

没有确切定义返回值类型,运行的数组每一项都可以是任意类型

function createArray(length: number, value: any): Array<any> {
  let arr = [];
  for (let i = 0; i < length; i++) {
    arr[i] = value;
  }
  return arr;
}
createArray(3, 1);

使用范型将其改造
泛型可以帮助我们约定线束规范

function createArray<T>(length: number, value: T): Array<T> {
  let arr = [];
  for (let i = 0; i < length; i++) {
    arr[i] = value;
  }
  return arr;
}
let strArray: string[] = createArray<string>(3, '1');

不传的时候根据类型进行反推

let numArray: number[] = createArray(3, 1);

接口当中采用泛型

interface ICreate {
  <T>(name: string, value: T): Array<T>;
}
let func: ICreate = function <T>(name: string, value: T): Array<T> {
  return [];
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值