From 329ce662fcda4514031ae21f1765e75b8d7965c7 Mon Sep 17 00:00:00 2001 From: Lenz Weber Date: Tue, 26 Jul 2022 20:29:30 +0200 Subject: [PATCH 1/6] `createSlice`: correctly infer `state` in TS 4.8 --- .github/workflows/tests.yml | 3 ++- packages/toolkit/src/createSlice.ts | 17 +++++++------- .../toolkit/src/tests/createSlice.typetest.ts | 23 +++++++++++++++---- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4169f951b8..3e59a3ab5d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -96,7 +96,8 @@ jobs: fail-fast: false matrix: node: ['16.x'] - ts: ['4.1', '4.2', '4.3', '4.4', '4.5', '4.6', '4.7'] + ts: ['4.1', '4.2', '4.3', '4.4', '4.5', '4.6', '4.7', 'next'] + continue-on-error: ${{ matrix.ts == 'next' }} steps: - name: Checkout repo uses: actions/checkout@v2 diff --git a/packages/toolkit/src/createSlice.ts b/packages/toolkit/src/createSlice.ts index 341929b15a..de23972734 100644 --- a/packages/toolkit/src/createSlice.ts +++ b/packages/toolkit/src/createSlice.ts @@ -227,15 +227,16 @@ type SliceDefinedCaseReducers> = { export type ValidateSliceCaseReducers< S, ACR extends SliceCaseReducers -> = ACR & { - [T in keyof ACR]: ACR[T] extends { - reducer(s: S, action?: infer A): any +> = ACR & + { + [T in keyof ACR]: ACR[T] extends { + reducer(s: S, action?: infer A): any + } + ? { + prepare(...a: never[]): Omit + } + : ACR[T] } - ? { - prepare(...a: never[]): Omit - } - : {} -} function getType(slice: string, actionKey: string): string { return `${slice}/${actionKey}` diff --git a/packages/toolkit/src/tests/createSlice.typetest.ts b/packages/toolkit/src/tests/createSlice.typetest.ts index 439a9298db..d405e0b815 100644 --- a/packages/toolkit/src/tests/createSlice.typetest.ts +++ b/packages/toolkit/src/tests/createSlice.typetest.ts @@ -56,7 +56,11 @@ const value = actionCreators.anyKey name: 'counter', initialState: 0, reducers: { - increment: (state: number, action) => state + action.payload, + increment: (state: number, action) => { + // @ts-expect-error + expect(state) + return state + action.payload + }, decrement: (state: number, action) => state - action.payload, }, extraReducers: { @@ -92,14 +96,25 @@ const value = actionCreators.anyKey initialState: 0, reducers: { increment: (state) => state + 1, - decrement: (state, { payload = 1 }: PayloadAction) => - state - payload, + decrement: ( + state, + { payload = 1 }: PayloadAction + ) => { + // @ts-expect-error + expect(state) + return state - payload + }, + multiply: (state, { payload }: PayloadAction) => Array.isArray(payload) ? payload.reduce((acc, val) => acc * val, state) : state * payload, addTwo: { - reducer: (s, { payload }: PayloadAction) => s + payload, + reducer: (s, { payload }: PayloadAction) => { + // @ts-expect-error + expect(state) + return s + payload + }, prepare: (a: number, b: number) => ({ payload: a + b, }), From a44feccea3144ec721ef76c16fd84ecdf546ac06 Mon Sep 17 00:00:00 2001 From: Lenz Weber Date: Tue, 26 Jul 2022 20:44:42 +0200 Subject: [PATCH 2/6] adjust tests, try to provoke error --- .github/workflows/test-codegen.yml | 27 ++++++------------ .github/workflows/tests.yml | 28 +++++++------------ packages/toolkit/src/createSlice.ts | 10 +++++-- .../toolkit/src/tests/createSlice.typetest.ts | 8 +++--- packages/toolkit/tsconfig.test.json | 2 +- 5 files changed, 31 insertions(+), 44 deletions(-) diff --git a/.github/workflows/test-codegen.yml b/.github/workflows/test-codegen.yml index 0828487b62..8ed0a39285 100644 --- a/.github/workflows/test-codegen.yml +++ b/.github/workflows/test-codegen.yml @@ -6,27 +6,18 @@ defaults: run: working-directory: ./packages/rtk-query-codegen-openapi -on: [push, pull_request] +on: + push: + branches: + - master + paths: + - 'packages/rtk-query-codegen-openapi/**' + pull_request: + paths: + - 'packages/rtk-query-codegen-openapi/**' jobs: - changes: - name: Check for changes - runs-on: ubuntu-latest - outputs: - codegen: ${{ steps.filter.outputs.codegen }} - steps: - - uses: actions/checkout@v2 - - uses: dorny/paths-filter@v2 - id: filter - with: - filters: | - codegen: - - 'packages/rtk-query-codegen-openapi/**' - build: - needs: changes - if: ${{ needs.changes.outputs.codegen == 'true' }} - runs-on: ubuntu-latest strategy: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3e59a3ab5d..39b4a4bb08 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,28 +1,20 @@ name: CI -on: [push, pull_request] +on: + push: + branches: + - master + paths: + - 'packages/toolkit/**' + pull_request: + paths: + - 'packages/toolkit/**' + defaults: run: working-directory: ./packages/toolkit jobs: - changes: - name: Check for changes - runs-on: ubuntu-latest - outputs: - toolkit: ${{ steps.filter.outputs.toolkit }} - steps: - - uses: actions/checkout@v2 - - uses: dorny/paths-filter@v2 - id: filter - with: - filters: | - toolkit: - - 'packages/toolkit/**' - build: - needs: changes - if: ${{ needs.changes.outputs.toolkit == 'true' }} - name: Lint, Test, Build & Pack on Node ${{ matrix.node }} runs-on: ubuntu-latest diff --git a/packages/toolkit/src/createSlice.ts b/packages/toolkit/src/createSlice.ts index de23972734..b4fb242747 100644 --- a/packages/toolkit/src/createSlice.ts +++ b/packages/toolkit/src/createSlice.ts @@ -235,7 +235,9 @@ export type ValidateSliceCaseReducers< ? { prepare(...a: never[]): Omit } - : ACR[T] + : {} + // this should still error in 4.8 - the fix woule be + // : ACR[T] } function getType(slice: string, actionKey: string): string { @@ -268,8 +270,10 @@ export function createSlice< typeof process !== 'undefined' && process.env.NODE_ENV === 'development' ) { - if(options.initialState === undefined) { - console.error('You must provide an `initialState` value that is not `undefined`. You may have misspelled `initialState`') + if (options.initialState === undefined) { + console.error( + 'You must provide an `initialState` value that is not `undefined`. You may have misspelled `initialState`' + ) } } diff --git a/packages/toolkit/src/tests/createSlice.typetest.ts b/packages/toolkit/src/tests/createSlice.typetest.ts index d405e0b815..85f9a80092 100644 --- a/packages/toolkit/src/tests/createSlice.typetest.ts +++ b/packages/toolkit/src/tests/createSlice.typetest.ts @@ -9,8 +9,8 @@ import type { PayloadAction, SliceCaseReducers, ValidateSliceCaseReducers, -} from '@reduxjs/toolkit' -import { createAction, createSlice } from '@reduxjs/toolkit' +} from '..' +import { createAction, createSlice } from '..' import { expectType } from './helpers' /* @@ -58,7 +58,7 @@ const value = actionCreators.anyKey reducers: { increment: (state: number, action) => { // @ts-expect-error - expect(state) + expectType(state) return state + action.payload }, decrement: (state: number, action) => state - action.payload, @@ -101,7 +101,7 @@ const value = actionCreators.anyKey { payload = 1 }: PayloadAction ) => { // @ts-expect-error - expect(state) + expectType(state) return state - payload }, diff --git a/packages/toolkit/tsconfig.test.json b/packages/toolkit/tsconfig.test.json index c5938454a1..499d081fe7 100644 --- a/packages/toolkit/tsconfig.test.json +++ b/packages/toolkit/tsconfig.test.json @@ -1,5 +1,5 @@ { - "extends": "../toolkit/tsconfig.base.json", + "extends": "./tsconfig.base.json", "compilerOptions": { "allowSyntheticDefaultImports": true, "esModuleInterop": true, From efef075bec9a1825033c6f4e4f16ac519507d3d3 Mon Sep 17 00:00:00 2001 From: Lenz Weber Date: Wed, 27 Jul 2022 08:58:42 +0200 Subject: [PATCH 3/6] and add the fix --- packages/toolkit/src/createSlice.ts | 4 +--- packages/toolkit/src/tests/createSlice.typetest.ts | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/toolkit/src/createSlice.ts b/packages/toolkit/src/createSlice.ts index b4fb242747..ab7fce403e 100644 --- a/packages/toolkit/src/createSlice.ts +++ b/packages/toolkit/src/createSlice.ts @@ -235,9 +235,7 @@ export type ValidateSliceCaseReducers< ? { prepare(...a: never[]): Omit } - : {} - // this should still error in 4.8 - the fix woule be - // : ACR[T] + : ACR[T] } function getType(slice: string, actionKey: string): string { diff --git a/packages/toolkit/src/tests/createSlice.typetest.ts b/packages/toolkit/src/tests/createSlice.typetest.ts index 85f9a80092..294f260709 100644 --- a/packages/toolkit/src/tests/createSlice.typetest.ts +++ b/packages/toolkit/src/tests/createSlice.typetest.ts @@ -9,8 +9,8 @@ import type { PayloadAction, SliceCaseReducers, ValidateSliceCaseReducers, -} from '..' -import { createAction, createSlice } from '..' +} from '@reduxjs/toolkit' +import { createAction, createSlice } from '@reduxjs/toolkit' import { expectType } from './helpers' /* From 036114728125c886fb8abc09b6dbf35253ebf8db Mon Sep 17 00:00:00 2001 From: Lenz Weber-Tronic Date: Fri, 5 Aug 2022 14:07:13 +0200 Subject: [PATCH 4/6] apply changed type only for TS versions >= 4.8 --- packages/toolkit/package.json | 1 + packages/toolkit/src/createSlice.ts | 4 +++- yarn.lock | 8 ++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index b9beac9955..e63a307db7 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -97,6 +97,7 @@ "query" ], "dependencies": { + "@phryneas/ts-version": "^1.0.1", "immer": "^9.0.7", "redux": "^4.1.2", "redux-thunk": "^2.4.1", diff --git a/packages/toolkit/src/createSlice.ts b/packages/toolkit/src/createSlice.ts index ab7fce403e..8234209983 100644 --- a/packages/toolkit/src/createSlice.ts +++ b/packages/toolkit/src/createSlice.ts @@ -235,7 +235,9 @@ export type ValidateSliceCaseReducers< ? { prepare(...a: never[]): Omit } - : ACR[T] + : import('@phryneas/ts-version').TSVersion.AtLeast<'4', '8'> extends true + ? ACR[T] + : {} } function getType(slice: string, actionKey: string): string { diff --git a/yarn.lock b/yarn.lock index 61b1be3b8f..549722badb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5484,6 +5484,13 @@ __metadata: languageName: node linkType: hard +"@phryneas/ts-version@npm:^1.0.1": + version: 1.0.1 + resolution: "@phryneas/ts-version@npm:1.0.1" + checksum: 897ee7a6c673fa48847518913418a51d96bf3a72092c4e1bbf3e8e715abe781ac17479e346e872a55ce7a48b70df88729056955f800a60259381d08d20563ec7 + languageName: node + linkType: hard + "@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.3": version: 0.5.7 resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.7" @@ -5596,6 +5603,7 @@ __metadata: resolution: "@reduxjs/toolkit@workspace:packages/toolkit" dependencies: "@microsoft/api-extractor": ^7.13.2 + "@phryneas/ts-version": ^1.0.1 "@size-limit/preset-small-lib": ^4.11.0 "@testing-library/react": ^13.3.0 "@testing-library/user-event": ^13.1.5 From 287ec73dd41e10b2c271c699d44408654f3208dc Mon Sep 17 00:00:00 2001 From: Lenz Weber-Tronic Date: Fri, 5 Aug 2022 14:27:37 +0200 Subject: [PATCH 5/6] take prerelease versions into account --- packages/toolkit/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index e63a307db7..667a9e1ffe 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -97,7 +97,7 @@ "query" ], "dependencies": { - "@phryneas/ts-version": "^1.0.1", + "@phryneas/ts-version": "^1.0.2", "immer": "^9.0.7", "redux": "^4.1.2", "redux-thunk": "^2.4.1", diff --git a/yarn.lock b/yarn.lock index 549722badb..587d64db1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5484,10 +5484,10 @@ __metadata: languageName: node linkType: hard -"@phryneas/ts-version@npm:^1.0.1": - version: 1.0.1 - resolution: "@phryneas/ts-version@npm:1.0.1" - checksum: 897ee7a6c673fa48847518913418a51d96bf3a72092c4e1bbf3e8e715abe781ac17479e346e872a55ce7a48b70df88729056955f800a60259381d08d20563ec7 +"@phryneas/ts-version@npm:^1.0.2": + version: 1.0.2 + resolution: "@phryneas/ts-version@npm:1.0.2" + checksum: d51914a8ea35ff8b686a9379b9e9fe6d5b5feaf2e7511b880d2835015736e33bc82952bbc369918f251d4a755f32f4a9c4a34b0ec4dfdbc3e87a41d26401105c languageName: node linkType: hard @@ -5603,7 +5603,7 @@ __metadata: resolution: "@reduxjs/toolkit@workspace:packages/toolkit" dependencies: "@microsoft/api-extractor": ^7.13.2 - "@phryneas/ts-version": ^1.0.1 + "@phryneas/ts-version": ^1.0.2 "@size-limit/preset-small-lib": ^4.11.0 "@testing-library/react": ^13.3.0 "@testing-library/user-event": ^13.1.5 From 62b771b464b1d89108b700817f3447940105709b Mon Sep 17 00:00:00 2001 From: Lenz Weber-Tronic Date: Fri, 5 Aug 2022 14:38:42 +0200 Subject: [PATCH 6/6] fixup --- packages/toolkit/src/createSlice.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolkit/src/createSlice.ts b/packages/toolkit/src/createSlice.ts index 8234209983..50592415c2 100644 --- a/packages/toolkit/src/createSlice.ts +++ b/packages/toolkit/src/createSlice.ts @@ -235,7 +235,7 @@ export type ValidateSliceCaseReducers< ? { prepare(...a: never[]): Omit } - : import('@phryneas/ts-version').TSVersion.AtLeast<'4', '8'> extends true + : import('@phryneas/ts-version').TSVersion.AtLeast<4, 8> extends true ? ACR[T] : {} }