singleton.interface.ts

export default interface Singleton<T> {
getValue: () => T
}

foo.ts

class FooSingleton implements Singleton<Foo> [
private foo: Foo

getValue() {
if(!foo) this.foo = new Foo();
return this.foo;
}
}

const fooSingleton = new FooSingleton()
export default fooSingleton as Singleton<Foo>

Do keep in mind the disadvantages of the singleton pattern

(src: Design Patterns in TypeScript - Singleton | The Startup)