TypeScript: Allow for chrome.settingsPrivate.PrefObject types

Includes examples where the benefit is immediately clear.

Bug: chromium:1373934
Change-Id: Ic7a5b39e328bd953b919e8d0706d01e1a368df92
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3949775
Commit-Queue: Wes Okuhara <wesokuhara@google.com>
Reviewed-by: Demetrios Papadopoulos <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1058869}
diff --git a/chrome/browser/resources/settings/appearance_page/home_url_input.ts b/chrome/browser/resources/settings/appearance_page/home_url_input.ts
index 888b92d1..b3f7b97 100644
--- a/chrome/browser/resources/settings/appearance_page/home_url_input.ts
+++ b/chrome/browser/resources/settings/appearance_page/home_url_input.ts
@@ -62,7 +62,7 @@
     };
   }
 
-  pref: chrome.settingsPrivate.PrefObject|undefined;
+  pref: chrome.settingsPrivate.PrefObject<string>|undefined;
   disabled: boolean;
   canTab: boolean;
   invalid: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/settings_scheduler_slider/settings_scheduler_slider.ts b/chrome/browser/resources/settings/chromeos/settings_scheduler_slider/settings_scheduler_slider.ts
index 3232948..8a6ace4 100644
--- a/chrome/browser/resources/settings/chromeos/settings_scheduler_slider/settings_scheduler_slider.ts
+++ b/chrome/browser/resources/settings/chromeos/settings_scheduler_slider/settings_scheduler_slider.ts
@@ -45,11 +45,6 @@
   ddy: number,
 }>;
 
-interface PrefObject extends chrome.settingsPrivate.PrefObject {
-  type: chrome.settingsPrivate.PrefType.NUMBER;
-  value: number;
-}
-
 const HOURS_PER_DAY = 24;
 const MIN_KNOBS_DISTANCE_MINUTES = 60;
 const OFFSET_MINUTES_6PM = 18 * 60;
@@ -151,8 +146,8 @@
     ];
   }
 
-  prefStartTime: PrefObject;
-  prefEndTime: PrefObject;
+  prefStartTime: chrome.settingsPrivate.PrefObject<number>;
+  prefEndTime: chrome.settingsPrivate.PrefObject<number>;
   private dragObject_: HTMLElement|null;
   private isReady_: boolean;
   private isRTL_: boolean;
diff --git a/chrome/browser/resources/settings/controls/settings_slider.ts b/chrome/browser/resources/settings/controls/settings_slider.ts
index 5996455..c2b7b4a 100644
--- a/chrome/browser/resources/settings/controls/settings_slider.ts
+++ b/chrome/browser/resources/settings/controls/settings_slider.ts
@@ -94,7 +94,7 @@
     ];
   }
 
-  pref: chrome.settingsPrivate.PrefObject;
+  pref: chrome.settingsPrivate.PrefObject<number>;
   ticks: SliderTick[]|number[];
   scale: number;
   min: number;
diff --git a/chrome/browser/resources/settings/privacy_page/personalization_options.ts b/chrome/browser/resources/settings/privacy_page/personalization_options.ts
index 25cc81c..3941dbb 100644
--- a/chrome/browser/resources/settings/privacy_page/personalization_options.ts
+++ b/chrome/browser/resources/settings/privacy_page/personalization_options.ts
@@ -119,7 +119,7 @@
   syncStatus: SyncStatus;
 
   // <if expr="_google_chrome and not chromeos_ash">
-  private metricsReportingPref_: chrome.settingsPrivate.PrefObject;
+  private metricsReportingPref_: chrome.settingsPrivate.PrefObject<boolean>;
   private showRestart_: boolean;
   // </if>
 
@@ -218,7 +218,7 @@
 
   private setMetricsReportingPref_(metricsReporting: MetricsReporting) {
     const hadPreviousPref = this.metricsReportingPref_.value !== undefined;
-    const pref: chrome.settingsPrivate.PrefObject = {
+    const pref: chrome.settingsPrivate.PrefObject<boolean> = {
       key: '',
       type: chrome.settingsPrivate.PrefType.BOOLEAN,
       value: metricsReporting.enabled,
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
index efc73f5..f02d8c40 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
@@ -86,7 +86,7 @@
    * set with the next sync prefs update.
    */
   private syncAllCache_: boolean|null = null;
-  private historySyncVirtualPref_: chrome.settingsPrivate.PrefObject;
+  private historySyncVirtualPref_: chrome.settingsPrivate.PrefObject<boolean>;
   private metricsBrowserProxy_: MetricsBrowserProxy =
       MetricsBrowserProxyImpl.getInstance();
   private startStateHistorySyncOn_: boolean;
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
index 05961e6..e2ad521 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
@@ -45,7 +45,7 @@
 
 interface BlockAutoplayStatus {
   enabled: boolean;
-  pref: chrome.settingsPrivate.PrefObject;
+  pref: chrome.settingsPrivate.PrefObject<boolean>;
 }
 
 export interface SettingsPrivacyPageElement {
diff --git a/chrome/browser/resources/settings/privacy_page/secure_dns.ts b/chrome/browser/resources/settings/privacy_page/secure_dns.ts
index a259f1b2..5254cfc 100644
--- a/chrome/browser/resources/settings/privacy_page/secure_dns.ts
+++ b/chrome/browser/resources/settings/privacy_page/secure_dns.ts
@@ -134,7 +134,7 @@
   }
 
   private secureDnsDescription_: string;
-  private secureDnsToggle_: chrome.settingsPrivate.PrefObject;
+  private secureDnsToggle_: chrome.settingsPrivate.PrefObject<boolean>;
   private showRadioGroup_: boolean;
   private secureDnsRadio_: SecureDnsMode;
   private resolverOptions_: ResolverOption[];
@@ -301,7 +301,7 @@
     }
     // If the underlying secure DNS mode pref has an enforced value, communicate
     // that via the toggle pref.
-    const pref: chrome.settingsPrivate.PrefObject = {
+    const pref: chrome.settingsPrivate.PrefObject<boolean> = {
       key: '',
       type: chrome.settingsPrivate.PrefType.BOOLEAN,
       value: this.secureDnsToggle_.value,
diff --git a/chrome/browser/resources/settings/site_settings/protocol_handlers.ts b/chrome/browser/resources/settings/site_settings/protocol_handlers.ts
index 1a03d97..4858894 100644
--- a/chrome/browser/resources/settings/site_settings/protocol_handlers.ts
+++ b/chrome/browser/resources/settings/site_settings/protocol_handlers.ts
@@ -144,7 +144,7 @@
   toggleOffLabel: string;
   toggleOnLabel: string;
   ignoredProtocols: HandlerEntry[];
-  private handlersEnabledPref_: chrome.settingsPrivate.PrefObject;
+  private handlersEnabledPref_: chrome.settingsPrivate.PrefObject<boolean>;
 
   override ready() {
     super.ready();
diff --git a/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts b/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts
index caefac3..ff77593 100644
--- a/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts
+++ b/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts
@@ -111,7 +111,7 @@
   blockOptionLabel: string;
   blockOptionSubLabel: string;
   blockOptionIcon: string;
-  private pref_: chrome.settingsPrivate.PrefObject;
+  private pref_: chrome.settingsPrivate.PrefObject<number>;
 
   override ready() {
     super.ready();
diff --git a/tools/typescript/definitions/settings_private.d.ts b/tools/typescript/definitions/settings_private.d.ts
index 905a3ba..2220a0d 100644
--- a/tools/typescript/definitions/settings_private.d.ts
+++ b/tools/typescript/definitions/settings_private.d.ts
@@ -35,15 +35,25 @@
         PARENT_SUPERVISED = 'PARENT_SUPERVISED',
       }
 
-      export interface PrefObject {
+      // TODO(crbug/1373934) Update existing usages of PrefObject to be typed,
+      // removing the need to use any here.
+      export interface PrefObject<T = any> {
         key: string;
-        type: PrefType;
-        value: any;
+        type:
+            // clang-format off
+            T extends boolean ? PrefType.BOOLEAN :
+            T extends number ? PrefType.NUMBER :
+            T extends string ? PrefType.STRING | PrefType.URL :
+            T extends unknown[] ? PrefType.LIST :
+            T extends Record<string|number, unknown> ? PrefType.DICTIONARY :
+            never;
+        // clang-format on
+        value: T;
         controlledBy?: ControlledBy;
         controlledByName?: string;
         enforcement?: Enforcement;
-        recommendedValue?: any;
-        userSelectableValues?: any[];
+        recommendedValue?: T;
+        userSelectableValues?: T[];
         userControlDisabled?: boolean;
         extensionId?: string;
         extensionCanBeDisabled?: boolean;