user482594
user482594

Reputation: 17486

When using dynamic import in a function, how can I specify type info in global variable?

My simplified server code looks like below.

server.ts

import google from "googleapis";

const androidPublisher = google.androidpublisher("v3");

app.use('something', function(req, res, n){
   ...
})

...(only one of the dozens of other methods use androidPublisher)

I am importing googleapis library in order to setup androidpublisher variable. However, this googleapis library is big and it takes 400ms~700ms to fully import file, when it takes 10ms~30ms to import other library files.

Because my environment is serverless architecture (firebase functions), AND because approximately 1 out of 100 requests actually need androidPublisher, I want to take advantage of dynamic import to import googleapis when it is necessary. Otherwise, above setup actually adds 400ms/700ms latency to every request that spins up new serverless instance, even when androidPublisher is not needed.

So I have made changes like below.

server.ts

let androidPublisherInstance:any;

async function getAndroidPublisher() {
    const googleapis = await import("googleapis");

    if (androidPublisherInstance === undefined) {
        const ap = googleapis.google.androidpublisher("v3");
        androidPublisherInstance = ap;
    }
    return androidPublisherInstance;
}


...(one of methods use getAndroidPublisher() to get androidPublisher instance)

with above setup where I am using global variable & helper function to initialize androidPublisher only when needed. This works as intended and 400ms~700ms latency gets added when androidPublisher is needed for the first time. However, I ended up with type of androidPublisherInstance to be any. I couldn't correctly define the type because type definition is available inside of googleapis and that is residing inside of getAndroidPublisher function.

Thus, I lose all benefit of using typescript and have to play guess games while using methods/properties when I use androidPublisherInstance.

And I think I must use global variable, because I do not want to initialize androidPublisher multiple times (googleapis.google.androidpublisher("v3")) whenever a function calls getAndroidPublisher()

Am I missing something? Is there a way to use dynamic import & let client to be initialized only once without needing to use global variable?

Upvotes: 0

Views: 332

Answers (1)

Bergi
Bergi

Reputation: 664538

You can just import the type. As long as you use it only in type definitions, not in value expressions, the compiled JavaScript will never load the module:

import { androidpublisher_v3 } from "googleapis";
let androidpublisher: androidpublisher_v3 | undefined;

Alternatively, to make sure you don't accidentally reference it in the wrong place, use only import types:

let androidpublisher: import("googleapis").androidpublisher_v3 | undefined;

Upvotes: 1

Related Questions