This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 0250092378c chore(frontend): TypeScript 6.0 readiness — declaration 
emit fixes (Phase A) (#39530)
0250092378c is described below

commit 0250092378cf557cab3c8ae66e7be8cbb1ddb0af
Author: Evan Rusackas <[email protected]>
AuthorDate: Fri May 8 10:42:07 2026 -0700

    chore(frontend): TypeScript 6.0 readiness — declaration emit fixes (Phase 
A) (#39530)
    
    Co-authored-by: Claude Opus 4.7 <[email protected]>
---
 superset-frontend/packages/superset-core/src/theme/Theme.tsx   |  7 +++++--
 superset-frontend/packages/superset-core/types/external.d.ts   |  7 +++++++
 superset-frontend/src/SqlLab/actions/sqlLab.ts                 |  8 ++++----
 superset-frontend/src/dashboard/components/Dashboard.tsx       |  2 +-
 superset-frontend/src/dashboard/components/DashboardGrid.tsx   |  2 +-
 .../dashboard/components/filterscope/FilterScopeSelector.tsx   |  2 +-
 .../components/gridComponents/ChartHolder/ChartHolder.tsx      |  2 +-
 .../src/dashboard/components/gridComponents/Column/Column.tsx  |  2 +-
 .../dashboard/components/gridComponents/Markdown/Markdown.tsx  | 10 +++++-----
 .../src/dashboard/components/gridComponents/Tab/Tab.tsx        |  2 +-
 .../src/dashboard/components/gridComponents/Tabs/Tabs.tsx      |  2 +-
 superset-frontend/src/dashboard/reducers/dashboardFilters.ts   |  2 +-
 superset-frontend/src/dashboard/reducers/dashboardInfo.ts      |  8 +++++---
 superset-frontend/src/dataMask/reducer.ts                      |  6 +++---
 .../explore/components/controls/CollectionControl/index.tsx    |  2 +-
 .../explore/components/controls/DatasourceControl/index.tsx    |  2 +-
 .../controls/FilterControl/AdhocFilterControl/index.tsx        |  2 +-
 .../components/controls/MetricControl/MetricsControl.tsx       |  2 +-
 .../src/features/databases/DatabaseModal/styles.ts             |  9 ++++++++-
 superset-frontend/src/features/reports/ReportModal/styles.tsx  |  5 ++++-
 20 files changed, 53 insertions(+), 31 deletions(-)

diff --git a/superset-frontend/packages/superset-core/src/theme/Theme.tsx 
b/superset-frontend/packages/superset-core/src/theme/Theme.tsx
index 138a0ace9b6..a0c02f740d0 100644
--- a/superset-frontend/packages/superset-core/src/theme/Theme.tsx
+++ b/superset-frontend/packages/superset-core/src/theme/Theme.tsx
@@ -38,9 +38,12 @@ import {
 import { normalizeThemeConfig, serializeThemeConfig } from './utils';
 
 export class Theme {
-  theme: SupersetTheme;
+  // Assigned via setConfig() in the constructor; TypeScript 6.0's
+  // strictPropertyInitialization can't trace that call chain, so we use
+  // a definite-assignment assertion.
+  theme!: SupersetTheme;
 
-  private antdConfig: AntdThemeConfig;
+  private antdConfig!: AntdThemeConfig;
 
   private constructor({ config }: { config?: AnyThemeConfig }) {
     this.SupersetThemeProvider = this.SupersetThemeProvider.bind(this);
diff --git a/superset-frontend/packages/superset-core/types/external.d.ts 
b/superset-frontend/packages/superset-core/types/external.d.ts
index dcce5fa8823..da31a12abc8 100644
--- a/superset-frontend/packages/superset-core/types/external.d.ts
+++ b/superset-frontend/packages/superset-core/types/external.d.ts
@@ -20,3 +20,10 @@
  * Stub for the untyped jed module.
  */
 declare module 'jed';
+
+/**
+ * CSS side-effect imports from @fontsource packages. These are bundler-only
+ * artifacts and carry no type information at runtime; declaring them here
+ * silences TS2882 under TypeScript 6.0's stricter module-resolution rules.
+ */
+declare module '@fontsource/*';
diff --git a/superset-frontend/src/SqlLab/actions/sqlLab.ts 
b/superset-frontend/src/SqlLab/actions/sqlLab.ts
index dc5441ecfd0..883f50d40f1 100644
--- a/superset-frontend/src/SqlLab/actions/sqlLab.ts
+++ b/superset-frontend/src/SqlLab/actions/sqlLab.ts
@@ -856,7 +856,7 @@ export function loadQueryEditor(queryEditor: QueryEditor): 
SqlLabAction {
   return { type: LOAD_QUERY_EDITOR, queryEditor };
 }
 
-interface TableSchema {
+export interface TableSchema {
   description: {
     columns: unknown[];
     selectStar: string;
@@ -1284,7 +1284,7 @@ export function addTable(
   };
 }
 
-interface NewTable {
+export interface NewTable {
   id?: string;
   dbId: number | string;
   catalog?: string | null;
@@ -1346,7 +1346,7 @@ export function runTablePreviewQuery(
   };
 }
 
-interface TableMetaData {
+export interface TableMetaData {
   columns?: unknown[];
   selectStar?: string;
   primaryKey?: unknown;
@@ -1660,7 +1660,7 @@ export function createDatasourceFailed(err: string): 
SqlLabAction {
   return { type: CREATE_DATASOURCE_FAILED, err };
 }
 
-interface VizOptions {
+export interface VizOptions {
   dbId: number;
   catalog?: string | null;
   schema: string;
diff --git a/superset-frontend/src/dashboard/components/Dashboard.tsx 
b/superset-frontend/src/dashboard/components/Dashboard.tsx
index d349a89464c..51519ba2309 100644
--- a/superset-frontend/src/dashboard/components/Dashboard.tsx
+++ b/superset-frontend/src/dashboard/components/Dashboard.tsx
@@ -67,7 +67,7 @@ interface DashboardActions {
   setDatasources: (datasources: unknown) => void;
 }
 
-interface DashboardProps {
+export interface DashboardProps {
   actions: DashboardActions;
   dashboardId: number;
   editMode?: boolean;
diff --git a/superset-frontend/src/dashboard/components/DashboardGrid.tsx 
b/superset-frontend/src/dashboard/components/DashboardGrid.tsx
index 3882debd270..a85815c39bc 100644
--- a/superset-frontend/src/dashboard/components/DashboardGrid.tsx
+++ b/superset-frontend/src/dashboard/components/DashboardGrid.tsx
@@ -32,7 +32,7 @@ import { Droppable } from './dnd/DragDroppable';
 import { GRID_GUTTER_SIZE, GRID_COLUMN_COUNT } from '../util/constants';
 import { TAB_TYPE } from '../util/componentTypes';
 
-interface DashboardGridProps {
+export interface DashboardGridProps {
   depth: number;
   editMode?: boolean;
   canEdit?: boolean;
diff --git 
a/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.tsx
 
b/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.tsx
index 7d10c1b691d..63e585d852f 100644
--- 
a/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.tsx
+++ 
b/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.tsx
@@ -80,7 +80,7 @@ interface FilterScopeMap {
   [key: string]: FilterScopeMapEntry;
 }
 
-interface FilterScopeSelectorProps {
+export interface FilterScopeSelectorProps {
   dashboardFilters: Record<number, DashboardFilter>;
   layout: DashboardLayout;
   updateDashboardFiltersScope: (
diff --git 
a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder/ChartHolder.tsx
 
b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder/ChartHolder.tsx
index 4d9ec92a3f6..7894796ed62 100644
--- 
a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder/ChartHolder.tsx
+++ 
b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder/ChartHolder.tsx
@@ -43,7 +43,7 @@ import {
 
 export const CHART_MARGIN = 32;
 
-interface ChartHolderProps {
+export interface ChartHolderProps {
   id: string;
   parentId: string;
   dashboardId: number;
diff --git 
a/superset-frontend/src/dashboard/components/gridComponents/Column/Column.tsx 
b/superset-frontend/src/dashboard/components/gridComponents/Column/Column.tsx
index f6b31cc5adf..72be4b59a67 100644
--- 
a/superset-frontend/src/dashboard/components/gridComponents/Column/Column.tsx
+++ 
b/superset-frontend/src/dashboard/components/gridComponents/Column/Column.tsx
@@ -39,7 +39,7 @@ import backgroundStyleOptions from 
'src/dashboard/util/backgroundStyleOptions';
 import { BACKGROUND_TRANSPARENT } from 'src/dashboard/util/constants';
 import { EMPTY_CONTAINER_Z_INDEX } from 'src/dashboard/constants';
 
-interface ColumnProps {
+export interface ColumnProps {
   id: string;
   parentId: string;
   component: LayoutItem;
diff --git 
a/superset-frontend/src/dashboard/components/gridComponents/Markdown/Markdown.tsx
 
b/superset-frontend/src/dashboard/components/gridComponents/Markdown/Markdown.tsx
index b10e4e23224..55f7426348d 100644
--- 
a/superset-frontend/src/dashboard/components/gridComponents/Markdown/Markdown.tsx
+++ 
b/superset-frontend/src/dashboard/components/gridComponents/Markdown/Markdown.tsx
@@ -43,13 +43,13 @@ import {
   GRID_BASE_UNIT,
 } from 'src/dashboard/util/constants';
 
-interface EditorInstance {
+export interface EditorInstance {
   resize?: (force: boolean) => void;
   getSession?: () => { setUseWrapMode: (wrap: boolean) => void };
   focus?: () => void;
 }
 
-interface MarkdownOwnProps {
+export interface MarkdownOwnProps {
   id: string;
   parentId: string;
   component: LayoutItem;
@@ -71,7 +71,7 @@ interface MarkdownOwnProps {
   updateComponents: (components: Record<string, LayoutItem>) => void;
 }
 
-interface MarkdownStateProps {
+export interface MarkdownStateProps {
   logEvent: (eventName: string, eventData: JsonObject) => void;
   addDangerToast: (msg: string) => void;
   undoLength: number;
@@ -80,9 +80,9 @@ interface MarkdownStateProps {
   htmlSchemaOverrides?: JsonObject;
 }
 
-type MarkdownProps = MarkdownOwnProps & MarkdownStateProps;
+export type MarkdownProps = MarkdownOwnProps & MarkdownStateProps;
 
-interface MarkdownState {
+export interface MarkdownState {
   isFocused: boolean;
   markdownSource: string;
   editor: EditorInstance | null;
diff --git 
a/superset-frontend/src/dashboard/components/gridComponents/Tab/Tab.tsx 
b/superset-frontend/src/dashboard/components/gridComponents/Tab/Tab.tsx
index 86ef757b4a7..f2486a80dc8 100644
--- a/superset-frontend/src/dashboard/components/gridComponents/Tab/Tab.tsx
+++ b/superset-frontend/src/dashboard/components/gridComponents/Tab/Tab.tsx
@@ -57,7 +57,7 @@ export const RENDER_TAB_CONTENT = 'RENDER_TAB_CONTENT';
 // Delay before refreshing charts to ensure they are fully mounted
 const CHART_MOUNT_DELAY = 100;
 
-interface TabProps {
+export interface TabProps {
   dashboardId: number;
   id: string;
   parentId: string;
diff --git 
a/superset-frontend/src/dashboard/components/gridComponents/Tabs/Tabs.tsx 
b/superset-frontend/src/dashboard/components/gridComponents/Tabs/Tabs.tsx
index d3eacb0cf7d..26c9b79d603 100644
--- a/superset-frontend/src/dashboard/components/gridComponents/Tabs/Tabs.tsx
+++ b/superset-frontend/src/dashboard/components/gridComponents/Tabs/Tabs.tsx
@@ -44,7 +44,7 @@ import TabsRenderer from '../TabsRenderer';
 import type { LayoutItem, RootState } from 'src/dashboard/types';
 import type { DropResult } from 
'src/dashboard/components/dnd/dragDroppableConfig';
 
-interface TabsProps {
+export interface TabsProps {
   id: string;
   parentId: string;
   component: LayoutItem;
diff --git a/superset-frontend/src/dashboard/reducers/dashboardFilters.ts 
b/superset-frontend/src/dashboard/reducers/dashboardFilters.ts
index d4defa36c72..062673bb8b5 100644
--- a/superset-frontend/src/dashboard/reducers/dashboardFilters.ts
+++ b/superset-frontend/src/dashboard/reducers/dashboardFilters.ts
@@ -30,7 +30,7 @@ import { buildActiveFilters } from 
'../util/activeDashboardFilters';
 import { getChartIdAndColumnFromFilterKey } from 
'../util/getDashboardFilterKey';
 import { LayoutItem } from '../types';
 
-interface FilterScope {
+export interface FilterScope {
   scope: string[];
   immune: number[];
 }
diff --git a/superset-frontend/src/dashboard/reducers/dashboardInfo.ts 
b/superset-frontend/src/dashboard/reducers/dashboardInfo.ts
index 94a1f671058..26c919f01b3 100644
--- a/superset-frontend/src/dashboard/reducers/dashboardInfo.ts
+++ b/superset-frontend/src/dashboard/reducers/dashboardInfo.ts
@@ -57,7 +57,7 @@ interface DashboardInfoAction {
   [key: string]: unknown;
 }
 
-interface HydrateDashboardAction {
+export interface HydrateDashboardInfoAction {
   type: typeof HYDRATE_DASHBOARD;
   data: {
     dashboardInfo: DashboardInfo;
@@ -65,7 +65,9 @@ interface HydrateDashboardAction {
   };
 }
 
-type DashboardInfoReducerAction = DashboardInfoAction | HydrateDashboardAction;
+type DashboardInfoReducerAction =
+  | DashboardInfoAction
+  | HydrateDashboardInfoAction;
 
 type DashboardInfoState = Partial<DashboardInfo> & {
   last_modified_time?: number;
@@ -74,7 +76,7 @@ type DashboardInfoState = Partial<DashboardInfo> & {
 
 function isHydrateAction(
   action: DashboardInfoReducerAction,
-): action is HydrateDashboardAction {
+): action is HydrateDashboardInfoAction {
   return action.type === HYDRATE_DASHBOARD;
 }
 
diff --git a/superset-frontend/src/dataMask/reducer.ts 
b/superset-frontend/src/dataMask/reducer.ts
index 5ae614eb048..bba15c0aea9 100644
--- a/superset-frontend/src/dataMask/reducer.ts
+++ b/superset-frontend/src/dataMask/reducer.ts
@@ -66,7 +66,7 @@ interface DashboardMetadata {
   chart_customization_config?: ChartCustomization[];
 }
 
-interface HydrateDashboardAction {
+export interface HydrateDataMaskAction {
   type: typeof HYDRATE_DASHBOARD;
   data: {
     dashboardInfo: {
@@ -199,7 +199,7 @@ function updateDataMaskForFilterChanges(
 const dataMaskReducer = produce(
   (
     draft: DataMaskStateWithId,
-    action: AnyDataMaskAction | HydrateDashboardAction | HydrateExplore,
+    action: AnyDataMaskAction | HydrateDataMaskAction | HydrateExplore,
   ) => {
     const cleanState: DataMaskStateWithId = {};
     switch (action.type) {
@@ -213,7 +213,7 @@ const dataMaskReducer = produce(
         };
         return draft;
       case HYDRATE_DASHBOARD: {
-        const hydrateDashboardAction = action as HydrateDashboardAction;
+        const hydrateDashboardAction = action as HydrateDataMaskAction;
         const metadata = hydrateDashboardAction.data.dashboardInfo?.metadata;
         const loadedDataMask = hydrateDashboardAction.data.dataMask;
 
diff --git 
a/superset-frontend/src/explore/components/controls/CollectionControl/index.tsx 
b/superset-frontend/src/explore/components/controls/CollectionControl/index.tsx
index 0ad904731fa..2b0e01b0129 100644
--- 
a/superset-frontend/src/explore/components/controls/CollectionControl/index.tsx
+++ 
b/superset-frontend/src/explore/components/controls/CollectionControl/index.tsx
@@ -50,7 +50,7 @@ interface CollectionItem {
   [key: string]: unknown;
 }
 
-interface CollectionControlProps {
+export interface CollectionControlProps {
   name: string;
   label?: string | null;
   description?: string | null;
diff --git 
a/superset-frontend/src/explore/components/controls/DatasourceControl/index.tsx 
b/superset-frontend/src/explore/components/controls/DatasourceControl/index.tsx
index 5c22595bd63..e9e36d72d5c 100644
--- 
a/superset-frontend/src/explore/components/controls/DatasourceControl/index.tsx
+++ 
b/superset-frontend/src/explore/components/controls/DatasourceControl/index.tsx
@@ -94,7 +94,7 @@ interface FormData {
   [key: string]: unknown;
 }
 
-interface DatasourceControlProps {
+export interface DatasourceControlProps {
   actions: DatasourceControlActions;
   onChange?: () => void;
   value?: string | null;
diff --git 
a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.tsx
 
b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.tsx
index f51da2fdc13..943d9100846 100644
--- 
a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.tsx
+++ 
b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.tsx
@@ -69,7 +69,7 @@ interface Datasource {
   [key: string]: unknown;
 }
 
-interface AdhocFilterControlProps {
+export interface AdhocFilterControlProps {
   label?: ReactNode;
   name?: string;
   sections?: string[];
diff --git 
a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.tsx
 
b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.tsx
index a3cd9bad883..656d01bb310 100644
--- 
a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.tsx
+++ 
b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.tsx
@@ -108,7 +108,7 @@ const getMetricsMatchingCurrentDataset = (
     );
   });
 
-interface MetricsControlProps {
+export interface MetricsControlProps {
   name: string;
   onChange: (value: unknown) => void;
   multi?: boolean;
diff --git a/superset-frontend/src/features/databases/DatabaseModal/styles.ts 
b/superset-frontend/src/features/databases/DatabaseModal/styles.ts
index c8e37d93412..8aa9aa16ec2 100644
--- a/superset-frontend/src/features/databases/DatabaseModal/styles.ts
+++ b/superset-frontend/src/features/databases/DatabaseModal/styles.ts
@@ -293,10 +293,17 @@ export const StyledInputContainer = styled.div`
   `}
 `;
 
+// Named-reference type annotation: TypeScript 6.0 declaration emit (TS2883)
+// won't let us leak react-ace's IAceOptions/ICommand/IEditorProps/IMarker
+// through the inferred type because they live in @superset-ui/core's nested
+// node_modules and aren't portable. Aliasing to `typeof JsonEditor` emits a
+// named reference in the .d.ts instead of the expanded structural type.
+// The styled-components and ForwardRefExoticComponent shapes don't overlap
+// structurally, so we bounce through `unknown` to widen the cast.
 export const StyledJsonEditor = styled(JsonEditor)`
   flex: 1 1 auto;
   /* Border is already applied by AceEditor itself */
-`;
+` as unknown as typeof JsonEditor;
 
 export const StyledExpandableForm = styled.div`
   padding-top: ${({ theme }) => theme.sizeUnit}px;
diff --git a/superset-frontend/src/features/reports/ReportModal/styles.tsx 
b/superset-frontend/src/features/reports/ReportModal/styles.tsx
index 14acc3e0012..0b487bd6803 100644
--- a/superset-frontend/src/features/reports/ReportModal/styles.tsx
+++ b/superset-frontend/src/features/reports/ReportModal/styles.tsx
@@ -67,10 +67,13 @@ export const StyledScheduleTitle = styled.div`
   }
 `;
 
+// Named-reference type annotation: TypeScript 6.0 declaration emit (TS2883)
+// can't name CronProps from react-js-cron via its nested node_modules path.
+// Aliasing to `typeof CronPicker` emits a named reference in the .d.ts.
 export const StyledCronPicker = styled(CronPicker)`
   margin-bottom: ${({ theme }) => theme.sizeUnit * 3}px;
   width: ${({ theme }) => theme.sizeUnit * 120}px;
-`;
+` as typeof CronPicker;
 
 export const StyledCronError = styled.p`
   color: ${({ theme }) => theme.colorError};

Reply via email to