TypeScript实用类型

188 阅读2分钟

书写 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 的好处。隐约觉得如果函数、模块都限制他们真正需要的类型,可以解决使用者的很多不正确使用,自身的类型推导+断言+声明,让关联的类型在系统中流转起来,减少维护成本。