【TypeScirpt学习记录】二

TS在函数中的部分应用

可选参数与rest参数:

可选参数:
可选参数必须放在必选参数后面,可以用?来表示可选参数,也可以定义一个默认值,既然有默认值那肯定是可选参数了。例子:

const foo1 = (name: string, age?: number, food: string = 'banana'): number => { 
	const inputAge = age || 18;
	return name.length + inputAge + food.length;
}

rest 参数:

const foo2= (name: string, ...rest: any[]) => {}

也可以用元组来进行标注:

const foo2=(name:string,...rest:[string,boolean])=>{}

重载

函数重载签名:实现入参关联的返回值类型:

function func(foo: number, bar: true): string;
function func(foo: number, bar?: false): number;
function func(foo: number, bar?: boolean): string | number {
  if (bar) {
    return String(foo);
  } else {
    return foo * 599;
  }
}

const res1 = func(599); // number
const res2 = func(599, true); // string
const res3 = func(599, false); // number

重载没太理解有什么意义,后续再学习~~T-T

异步函数,需要返回一个Promise<T>

async function asyncFunc(): Promise<void> {}

内置类型:any/unknown/never与类型断言

any:任意类型
unknown:表示未知类型。 unknown再次赋值,只能赋值给any和unknown类型。
any和unknown的最大区别:any放弃了所有类型检查,但是unknown并没有。

当类型未知时,可以使用unknown标注,结合类型断言使用。

never:不携带任何类型信息,never只能赋值给never
never被称为Bottom Type,是整个类型系统层级中最底层的类型。

类型断言

基本语法: as newType
用处:

在ts类型分析不正确或不符合预期时,将其断言为此处的正确类型

另外一个用处是做提示辅助功能,例如:

interface IStruct {
  foo: string;
  bar: {
    barPropA: string;
    barPropB: number;
    barMethod: () => void;
    baz: {
      handler: () => Promise<void>;
    };
  };
}

如果要基于上面实现一个对象,可能会这样写:

const obj: IStruct = {};

但会出现一堆类型报错,提示你必须实现整个接口结构才行。如果此时使用类型断言,就能在保留类型提示的前提下,不那么完整地实现这个结构:

const obj = {
	bar: {
		baz: {}
	}
} as IStruct 

或者使用<>
const obj = <IStruct>{
	bar: {
		baz: {}
	}
}

类型工具

类型别名可以声明自己能接受泛型,就变成了类型工具

type Factory<T> = T | number | string;

可以变得更加灵活:

const foo: Factory<boolean> = true;

联合类型和交叉类型

联合类型: | 满足其中一个就行了
交叉类型: & 必须同时满足
交叉类型&如果没有返回 会提示为never

type StrAndNum = string & number; // never

索引类型
通过索引的形式来进行类型操作
索引签名类型:快速声明一个键值类型一致的类型结构

interface AllStringTypes {
  [key: string]: string;
}

只能声明string类型的键值。

const foo: AllStringTypes  = {
	"food": "599"
}

但由于 JavaScript 中,对于 obj[prop] 形式的访问会将数字索引访问转换为字符串索引访问,也就是说, obj[599] 和 obj[‘599’] 的效果是一致的。因此,在字符串索引签名类型中我们仍然可以声明数字类型的键。类似的,symbol 类型也是如此:

const foo: AllStringTypes = {
  "linbudu": "599",
  599: "linbudu",
  [Symbol("ddd")]: 'symbol',
}

索引类型查询

keyof 可以将对象中的所有键转换为对应字面量类型,再组合成联合类型

keyof的产物必定是个联合类型

type TypesKey = keyof any

等同于

type TypesKey = string | number | symbol

索引类型访问

interface Foo {
  propA: number;
  propB: boolean;
}

type PropAType = Foo['propA']; // number
type PropBType = Foo['propB']; // boolean

通过keyof可以简化

interface Foo {
  propA: number;
  propB: boolean;
}

type PropAType = Foo[keyof Foo]   //  number | boolean

映射类型:

type Stringify<T> = {
  [K in keyof T]: string;
};

进行克隆

type Clone<T> = {
	[K in typeof T]: T[k];
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值