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 4169f951b8..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
@@ -96,7 +88,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/package.json b/packages/toolkit/package.json
index b9beac9955..667a9e1ffe 100644
--- a/packages/toolkit/package.json
+++ b/packages/toolkit/package.json
@@ -97,6 +97,7 @@
     "query"
   ],
   "dependencies": {
+    "@phryneas/ts-version": "^1.0.2",
     "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 341929b15a..50592415c2 100644
--- a/packages/toolkit/src/createSlice.ts
+++ b/packages/toolkit/src/createSlice.ts
@@ -227,15 +227,18 @@ type SliceDefinedCaseReducers<CaseReducers extends SliceCaseReducers<any>> = {
 export type ValidateSliceCaseReducers<
   S,
   ACR extends SliceCaseReducers<S>
-> = 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<A, 'type'>
+        }
+      : import('@phryneas/ts-version').TSVersion.AtLeast<4, 8> extends true
+      ? ACR[T]
+      : {}
   }
-    ? {
-        prepare(...a: never[]): Omit<A, 'type'>
-      }
-    : {}
-}
 
 function getType(slice: string, actionKey: string): string {
   return `${slice}/${actionKey}`
@@ -267,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 439a9298db..294f260709 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
+        expectType<string>(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<number | undefined>) =>
-        state - payload,
+      decrement: (
+        state,
+        { payload = 1 }: PayloadAction<number | undefined>
+      ) => {
+        // @ts-expect-error
+        expectType<string>(state)
+        return state - payload
+      },
+
       multiply: (state, { payload }: PayloadAction<number | number[]>) =>
         Array.isArray(payload)
           ? payload.reduce((acc, val) => acc * val, state)
           : state * payload,
       addTwo: {
-        reducer: (s, { payload }: PayloadAction<number>) => s + payload,
+        reducer: (s, { payload }: PayloadAction<number>) => {
+          // @ts-expect-error
+          expect<string>(state)
+          return s + payload
+        },
         prepare: (a: number, b: number) => ({
           payload: a + b,
         }),
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,
diff --git a/yarn.lock b/yarn.lock
index 61b1be3b8f..587d64db1d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5484,6 +5484,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@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
+
 "@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.2
     "@size-limit/preset-small-lib": ^4.11.0
     "@testing-library/react": ^13.3.0
     "@testing-library/user-event": ^13.1.5