[Typescript] Merge Object into Window with Types

For example we want to have one object merge into Window with type information as well.

import { Equal, Expect } from "../helpers/type-utils";

const addAllOfThisToWindow = {
  add: (a: number, b: number) => a + b,
  subtract: (a: number, b: number) => a - b,
  multiply: (a: number, b: number) => a * b,
  divide: (a: number, b: number) => a / b,
};

Object.assign(window, addAllOfThisToWindow);

type tests = [
  Expect<Equal<typeof window.add, (a: number, b: number) => number>>,
  Expect<Equal<typeof window.subtract, (a: number, b: number) => number>>,
  Expect<Equal<typeof window.multiply, (a: number, b: number) => number>>,
  Expect<Equal<typeof window.divide, (a: number, b: number) => number>>,
];

 

We know that, dealing with Window, we need global.

declare global {
  interface Window {
  
  }
}

 

Also we know that, with Window, we have to use interface, instead of type.

 

With interface, we can actually use extends keyword to merge with existing interface.

interface Person {
    name: string
    age: number
}

interface Employee extends Person {
    company: string
}

const e: Employee = {
    name: 'zwan',
    age: 25,
    company: 'abc'
}

 

So that can help, to solve the problem we can do:

import { Equal, Expect } from '../helpers/type-utils';

declare global {
  type TAddToWindow = typeof addAllOfThisToWindow;
  interface Window extends TAddToWindow {}
}

const addAllOfThisToWindow = {
  add: (a: number, b: number) => a + b,
  subtract: (a: number, b: number) => a - b,
  multiply: (a: number, b: number) => a * b,
  divide: (a: number, b: number) => a / b,
};

Object.assign(window, addAllOfThisToWindow);

type tests = [
  Expect<Equal<typeof window.add, (a: number, b: number) => number>>,
  Expect<Equal<typeof window.subtract, (a: number, b: number) => number>>,
  Expect<Equal<typeof window.multiply, (a: number, b: number) => number>>,
  Expect<Equal<typeof window.divide, (a: number, b: number) => number>>
];

 

posted @ 2023-02-24 15:22  Zhentiw  阅读(41)  评论(0编辑  收藏  举报