浅谈 TypeScript - 优雅的使用奇技淫巧

1,776 阅读2分钟

这篇文章会介绍一些如何优雅的使用 TypeScript 的奇技淫巧,如果你也有更多的使用技巧不妨评论留言,持续更新;

可选型

如果你能看见 ? 那么在 TypeScript 的世界中,它的表述是可能也许,因此在处理这段逻辑时需要用到 if,如:

function numS(s?: number) {
  if (s) {
    return s * 0;
  }
  return 0;
}

numS(0)

但是,某些情况下,我们可能不需要如此,假设这段函数就是因为如果 s 不是 number 时可以 throw 一个错误,因此,我们可以这样:

function v(s?: number){
  if (!s){
    throw new Error("");
  }
}

function numS(s?: number) {
  v(s);
  return s! * 0;
}

如果可以统一,那么看起来就没有那么多的 if 了。

Rest 参数

有时候我们可能需要批量的来获取参数,并且每一个参数的类型还不一样,我们可以声明一个元组如:

function query(...args:[string, number, boolean]){
  const d: string = args[0];
  const n: number = args[1];
  const b: boolean = args[2];
}

多参数返回

如果有一天我们遇到了需要返回多个不同类型的参数时:

function search(): [string, number] {
  return ["1", 1];
}

const {...args} = search();

args[0]
args[1]

另一种 Readonly

如果我们直接使用 readonly ,编译之后会增加很多其他的代码,如果我们利用 Class 的 get 钩子,也完全可以实现相同的场景,如:

class QueryP {
  public _g?: string;
  get g(){
    return this._g;
  }
}

const queryp = new QueryP();

// queryp.g = "1234";

如果我们对 g 赋值,编译器会给出如下的错误:

skill.ts:75:8 - error TS2540: Cannot assign to 'g' because it is a constant or a read-only property.

75 queryp.g = "1234";

如果你的 targetES5 ,那么你应该能想到 Object.defineProperty

推导对象Map的值

function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
  return names.map(n => o[n]);
}

const d = pluck({ 
  d:"123"
}, ["d"]);