microsoft / microsoft/TypeScript

Check JS doesn't narrow types properly

オープン
#39,132 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Needs Investigation
主要言語
Go
スター
111k
フォーク
14.4k
平均マージ
1日 19時間
マージ済み PR(30日)
117

説明

TypeScript Version: 3.7.x-dev.201xxxxx

Search Terms:

Code

import { useReducer } from 'react';

/**
 * @template {{ type: string; payload?: any; }} Action
 * @template {object} State
 * @template {{ past: State[]; present: State; future: State[]; }} UndoState
 * @template {{ type: 'UNDO'; } | { type: 'REDO'; }} UndoAction
 * @param {{ (state: State, action: Action): State; }} reducer
 * @param {State} initialState
 */
export function useUndoReducer(reducer, initialState) {
  /**
   * @param {UndoState} state
   * @param {UndoAction | Action} action
   */
  const undoReducer = (state, action) => {
    switch (action.type) {
      case 'UNDO': {
        const [newPresent, ...newPast] = state.past;

        return {
          past: newPast,
          present: newPresent,
          future: [state.present, ...state.future],
        };
      }
      case 'REDO': {
        const [newPresent, ...newFuture] = state.future;

        return {
          past: [state.present, ...state.past],
          present: newPresent,
          future: newFuture,
        };
      }
      default:
        return {
          past: [state.present, ...state.past],
          // @ts-ignore
          present: reducer(state.present, action),
          future: [],
        };
    }
  };

  return useReducer(undoReducer, {
    past: [],
    present: initialState,
    future: [],
  });
}

Expected behavior:

not having to use a @ts-ignore

Actual behavior:

had to use @ts-ignore

Playground Link:

https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=51&pc=1&useJavaScript=true#code/JYWwDg9gTgLgBAbzgVwM4FMBK6AmyDG6UcAvnAGZQQhwDkU6AhvjLQNwBQHA9AFS8c4vOAAEY6cABtG4xEhgBPMOgBccVDCjAAdgHM2cMIwWSIjHAH41jbQoMkyAQRbAI2wcLESw02QggARgBW6CxkAMowMugeouJS0XKGjBpqkdEA2gC6BmAMGNowaVHiBuTIMMgMxZk5pGQAqto4EOnisV4JfvJKqnQNAHIAIgDy7KRwAD6IcIrKarSYAKKj4w5wTS3OMK7uQqJGUIw0CEgAFBrRNeIANHDMO25q27sAlNfo9mQMeIRQHYdjog2ugyDpgDtGJIQR5uBx0AAPSCwCjIbQuNwoDCbCDYX5EM4-AhEO7gyHQkroV6IQRwPgCOCMzyAk44kFkS7tRn7EQsxA4l6Y6aC7RkB67WlCOGM-BuDQoZq43DE4gAXjgF0pd3FbmpqoAfDTueoAO4Q-AACw1Ou0ADo5lSjca4PgUuh+sMxmoEJLnbLtPKMtp0CaAAr5dCFO62mPBsMpGBZODqznoW1GDScX3GhiVKDaJ3O7kZopwOOhhM3bPOvLoAql8sRqPV43lPN9DKp9NNmDRmNdttVdBZKtFxkkThFkjV10YOjLVbelsuuXwIMh8N1yO9uAx21xgBiFSHSZTlNtg4YWbHcFzVQLPpvjJLak759r9b7tq7JZHy+fPZqI2W7Nk+qLtkBIZHu2o5jhO1bTkWODoOQjDIJIRTLne+aFmOL5wG+0TdiBO57j+CZ-mBH7bmoRJ-JqRHUVG9wYtorywTel4dpRcGTtyiGkNet7oHmBZoFgyr0WiLR4iqdyPsWCavjxAEkWoZLAFCIIceBQ7KbBJCvJw05AA

Related Issues:

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

報告されたバージョン 3.7.x-dev を使用して、リンクされた TypeScript Playground の再現例から始め、action.type に対する switch を通じて JSDoc 型がどのように絞り込まれるかを調べてください。報告された reducer 呼び出しを期待される型と比較してください。指定された reducer 型と action 型を維持したまま、例で @ts-ignore が不要になれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
javascript, react, typescript
領域
compilers
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
30/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。