LoginSignup
22
25

More than 3 years have passed since last update.

typescriptでアレがしたい

Last updated at Posted at 2018-02-26

typescriptというかjsのtips集です。
簡単なスニペットを溜めていきます

ローカルのファイルを読み込みたい

node環境限定

解: fsパッケージを使う


yarn add -D @types/node

import * as fs from 'fs';

// 同期的にバッファを取得
try {
  let buffer = fs.readFileSync(path)
  console.log(buffer)
} catch(error) {
  console.log(`failed to read ${error}`)
}

// 非同期でバッファを取得
async readFile() {
  try {
    let buffer = fs.readFile(path, () => {})
    console.log(buffer)
  } catch(error) {
    console.log(`failed to read ${error}`)
  }
}

// 読み込みストリーム
let stream = fs.createReadStream(path)
stream.on("data", (chunk) => {
  console.log(chunk)
})
stream.on("close", () => {
  console.log("stream closed")
})
stream.on("error", (error) => {
  console.log("stream error")
})

xsvフォーマットのテキストをパースしたい

解: csv-parseを使う

yarn add csv-parse

import * as fs from 'fs-extra';
import * as parse from 'csv-parse';

private parseTsv(filePath: string): Promise<any[]> {
  var result: any[] = []
  let parser = parse({delimiter: "\t", columns: true}, (err, data) => {
    result = result.concat(data)
  })
  return new Promise<any[]>((resolve: (value?: any[]) => void, reject: (reason?: any) => void) => {
    let stream = fs.createReadStream(filePath)
    stream.on("close", () => {
      resolve(result)
    })
    stream.on("error", (err) => {
      console.log(err)
      reject(err)
    })
    stream.pipe(parser)
  })
}


columns パラメータにtrueを渡してあげると、先頭の行をカラム名と解釈してくれる。
そうすると、parseメソッドに渡したクロージャには配列ではなく、先頭の行の項目をキーとしたハッシュが渡ってくるようになる。

書式指定フォーマット(printfのやつ)が使いたい

解: sprintf-jsを使用する

yarn add sprintf-js @types/sprintf-js

let zeroPaddingNumberString = sprintf("%03d", 10)
console.log(zeroPaddingNumberString) // 010が出力される

数値を0埋めしたい

解: String#sliceを使う

010と出力したい


const n = 10

`00${n}`.slice(-2)

union型を安全に使用する



interface IntroductionPage {
  type: "introduction";
}

interface ComicPage {
  type: "comic";
  index: number;
  imageUrl: string;
}

type Page = ComicPage | IntroductionPage;

function renderPage(page: Page) {
  // typeをチェックした後に補完が適切な型をサジェストしてくれるようになる。というのが便利

  switch (page.type) {
    case "introduction":
      return renderIntroductionPage();
    case "comic;
      return renderComicPage(page.index, page.imageUrl)
  }
}


22
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
25