TS 定义类型的一些骚操作

329 阅读1分钟

前言

本文主要收集一些常用和不常用的ts类型(不定期更新)
可以说只要类型推断写的好,sql语句结果的类型也是能推断出来的

字符串类型工具

/**
 * 分割
 * Split<'A,B,C',','> = 'A' | 'B' | 'C';
 */
type Split<S extends string, C extends string> = S extends `${infer A}${C}${infer B}`
  ? Split<A, C> | Split<B, C>
  : S;
  
/**
 * 组合
 * Combination<'a' | 'b','a' | 'b'> = 'a' | 'b' | 'a b' | 'b a'
 */
type Combination<T, V = T> = T extends infer A
  ? A extends string
    ? Exclude<V, A> extends never
      ? A
      : `${A} ${Combination<Exclude<V, A>, Exclude<V, A>>}` | Combination<Exclude<V, A>, Exclude<V, A>>
    : never
  : never;

/**
 * 移除空格
 */
type TrimStart<T extends string> = T extends ` ${infer A}` ? A : T;

/**
 * 移除空格
 */
type TrimEnd<T extends string> = T extends `${infer A} ` ? A : T;

/**
 * 'AbcDe' => 'abc de'
 */
type ToWord<T extends string> = T extends `${infer A}${infer B}`
  ? Capitalize<A> extends A
    ? ` ${Trim<Uncapitalize<A>>}${ToWord<B>}`
    : `${A}${ToWord<B>}`
  : T;

数据空判断

export const isEmpty = (obj: any): obj is undefined | 'undefined' | null | '' => {
  return obj === undefined || obj === null || obj === 'undefined' || obj === '';
};

export const isNull = (obj: any): obj is null | undefined => {
  return obj === undefined || obj === null;
};

type NonEmptyable<T> = T extends undefined | 'undefined' | null | '' ? never : T;

export const isNotEmpty = <T extends any>(obj: T): obj is NonEmptyable<T> => {
  return obj !== undefined && obj !== null && obj !== 'undefined' && obj !== '';
};

export const isNotNull = <T>(obj: T): obj is NonNullable<T> => {
  return !isNull(obj);
};

其他

/**
 * A | B => A & B
 */
export type OrToAnd<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;