ts-reset 入れてね

@yKicchan

Draft

自己紹介

きっちゃそ
:DeNA
Web Frontend
X @yKicchan

ts-reset 知ってる人 🙋‍♀️

なお全員知ってたらここで終わり

知ってた人は...

Twitter でもやっといて👋

ここから知らない人向け

TypeScript で開発していて

こんな経験ありませんか?

こんな経験ありませんか?

.filter(Boolean)で推論が効かない🤦

const array = [1, 2, null, 4, undefined, 6, 7];

const filteredArray = array.filter(Boolean);
// filteredArray: (number | null | undefined)[]🖕

TypeScript v5.5 以降では解消済み

こんな経験ありませんか?

.includes() が厳しすぎる😡

const array = [1, 2, 3] as const;

array.includes(4);
//            ^^^
// Argument of type 'number' is not assignable to
// parameter of type '1 | 2 | 3'.
こんな経験ありませんか?

.includes() が厳しすぎる😡

export const MyType = {
  Hoge: 1,
  Fuga: 2,
} as const;
export type MyType = typeof MyType[keyof typeof MyType];

export function isMyType(v: number): v is MyType {
  return Object.values(MyType).includes(v);
  //                                   ^^^
  // Argument of type 'number' is not assignable to
  // parameter of type '1 | 2'.
}
こんな経験ありませんか?

json が any になる🚨

const obj = JSON.perse('{}');
// obj: any 🖕

fetch('/')
  .then((res) => res.json())
  .then((json) => {
    console.log(json); // json: any 🖕
  });

そのつらみ

ts-reset で解決できます✨

ts-reset とは

A 'CSS reset' for TypeScript, improving types for common JavaScript API's

TypeScript用の「CSSリセット」、一般的なJavaScript APIの型を改善するもの。

ts-reset とは

Get Started

1. Install

$ npm i -D @total-typescript/ts-reset

アプリケーションでの利用とし、ライブラリで使用しないこと。
グローバルにリセットされユーザーが知らずに利用するハメになる。

2. Import

import "@total-typescript/ts-reset";

tsconfig.jsonmoduleResolutionNodeNext, Node16, Bundler のいずれかが必要。

ts-reset とは

.filter(Boolean)で推論が効いた!✅

import "@total-typescript/ts-reset";
const array = [1, 2, null, 4, undefined, 6, 7];

const filteredArray = array.filter(Boolean);
// filteredArray: number[]✨
ts-reset とは

.includes() が優しくなった!✅

import "@total-typescript/ts-reset";
const array = [1, 2, 3] as const;

array.includes(4);
// false ✨
ts-reset とは

.includes() が優しくなった!✅

import "@total-typescript/ts-reset";
export const MyType = {
  Hoge: 1,
  Fuga: 2,
} as const;
export type MyType = typeof MyType[keyof typeof MyType];

export function isMyType(v: number): v is MyType {
  return Object.values(MyType).includes(v);
  // エラーなし ✨
}
ts-reset とは

json が unknown になった!✅

import "@total-typescript/ts-reset";
const obj = JSON.perse('{}');
// obj: unknown ✨

fetch('/')
  .then((res) => res.json())
  .then((json) => {
    console.log(json); // json: unknown ✨
  });
ts-reset とは

個別のルール適応も可能

import '@total-typescript/ts-reset/array-includes';
import '@total-typescript/ts-reset/filter-boolean';

余談

ADR 書こう

ts-reset 入れてね。