Solución:
Está definiendo el tipo para el compilador, pero en realidad no lo adjunta al espacio de nombres global – window
en el navegador, global
en nodo. En lugar de exportarlo desde el módulo, adjúntelo. Para uso isomórfico, use algo como …
function s() { ... }
// must cast as any to set property on window
const _global = (window /* browser */ || global /* node */) as any
_global.s = s
También puede deshacerse del .d.ts
file y declare el tipo en el mismo archivo usando declare global
, p.ej
// we must force tsc to interpret this file as a module, resolves
// "Augmentations for the global scope can only be directly nested in external modules or ambient module declarations."
// error
export {}
declare global {
function s<T>(someObject: T | null | undefined, defaultValue?: T | null | undefined) : T;
}
const _global = (window /* browser */ || global /* node */) as any
_global.s = function<T>(object: T | null | undefined, defaultValue: T | null = null) : T {
if (typeof object === 'undefined' || object === null)
return defaultValue as T;
else
return object;
}
global.ts(x)
solo necesita un pequeño ajuste para ser un “módulo global” válido (un módulo con efectos secundarios únicamente): eliminar el export
palabra clave y agregue algo de código para aumentar el objeto global. También puede proporcionar la declaración global en el mismo archivo y eliminar global.d.ts
.
function _s<T>(object: T | null, defaultValue: T = {} as T) : T {
return object == null
? defaultValue
: object as T;
}
// Global declaration
declare var s: typeof _s;
// Global scope augmentation
var window = window || null;
const _global = (window || global) as any;
_global.s = _s;
Para usarlo, simplemente importe el módulo una vez, por ejemplo en App.tsx
a través de una importación global: import './global';
.
Probado con mocha, chai, ts-node:
import { expect } from 'chai';
import './global'; // To do once at app bootstrapping
describe('global s()', () => {
it('should replace null with empty object', () => {
const result = s(null);
expect(result).to.eql({});
});
it('should replace undefined with empty object', () => {
const result = s(undefined);
expect(result).to.eql({});
});
it('should replace null with the given default value', () => {
const defVal = { def: 'val' };
const result = s(null, defVal);
expect(result).to.eql({ def: 'val' });
});
it('should preserve defined object', () => {
const object = { bar: 'a' };
const result = s(object);
expect(result).to.eql(object);
});
});
Gracias a @Romain Deneau. Su respuesta funcionó para mí. Aquí está mi simplificado para que parezca más fácil entender el punto de su respuesta. (El mío asume que los scripts se ejecutan en un navegador. Además, omití la firma de la función s
.)
Defina la función fuera de cualquier clase.
function s() {
console.log("invoked s()!");
}
(window as any).s = s;
Usando esta función global s
de la clase TypeScript es como a continuación;
declare var s;
export class MyClass {
public static callFunctionS() {
s();
}
}