书写 TypeScript 程序时适时运用内置类型可以较少很多不必要的代码。如果您还没了解过内置的 UtilityTypes ,那么快了解一下吧,没准分分中瘦身类型声明!
获取函数参数声明
Parameters 为传入的类型参数返回参数类型的数组。
function getName (thing: {name: string}) {
return thing.name;
}
type Thing = Parameters<typeof getName>[0];
// {name: string}
如果我们需要获取某模块的某个复杂结构参数的类型,模块没有暴露,可以使用 Parameters 。
获取函数返回值声明
ReturnType 为传入的类型参数返回其返回值的类型。
function getName (thing: {name: string}) {
return thing.name;
}
type Name = ReturnType<typeof getName>;
// {name: string}
如果我们需要获取某模块的返回值类型,模块没有暴露,可以使用 ReturnType 。
创建键值类型映射
Record 接受两个参数分别是键值的类型,返回有映射关系的引用类型。
type anyMap = Record<string, any>; // {[key: string]: any}
type sexMap = Record<'W'|'M', any>;
// {
// 'W': any;
// 'M': any;
// }
经常书写的{[key: string]: any}可以换个优雅的写法了,而且传入联合类型可以得到约束紧密的映射关系。
抽取只包含特定类型的子类
Pick 接受原始类型和 key 的类型,返回过滤后的子类。
type Person = Pick<{
name?: string;
age: number;
sec: 'W'|'M';
}, 'name'|'age'>
// {
// name?: string;
// age: number;
// }
对于基于第三方结构操作的函数,可以缩小限制到函数真正关注的部分,增加函数通用性
获取不包含特定类型的子类
Omit 接受原始类型和 key 的类型,返回过滤后的子类。
type Person = Omit<{
name?: string;
age: number;
sec: 'W'|'M';
}, 'name'|'age'>
// {
// sec: 'W'|'M'
// }
刚刚接触TypeScript,还没有体会到 ta 的好处。隐约觉得如果函数、模块都限制他们真正需要的类型,可以解决使用者的很多不正确使用,自身的类型推导+断言+声明,让关联的类型在系统中流转起来,减少维护成本。