javascript - Grundläggande typescript-exempel på att använda protobufjs


Jag implementerar för närvarande översättning av protokollbuffertar i mitt TypeScript-projekt. Jag har fått protofilerna laddade i ProtoBuilder (med TypeScript-definitionsfilen från protobufjs.d.ts) och jag har returnerat en ProtoBuf från byggaren.

Om jag sätter en brytpunkt efter att jag har ProtoBuf-objektet i en variabel som heter pb, kan jag kalla pb.decode(buffer) i konsolen och det fungerar. TypeScript gillar dock inte syntaxen.

Efter mycket pillande och petande, inklusive att prova saker som:

pb["decode"](buffer)

(Detta ger Fel TS2349 Kan inte anropa ett uttryck vars typ saknar en anropssignatur.)

Jag kan fortfarande inte få TypeScript-kompilatorn att gilla koden.

Hur tar jag mig från ett TypeScript ProtoBuf-objekt till decode-funktionen som är gömd inom MetaMessage-objektet?

Om det spelar någon roll, så gör jag detta i Visual Studio 2015.

redigera: Jag kan kringgå problemet genom att använda:

var decoder: any = pb["decode"];
decoder(buffer);

Men jag skulle föredra en mer elegant lösning om en sådan finns.

Svar #1

Att arbeta med definitionsfiler för befintliga JavaScript-bibliotek kan vara knepigt, eftersom JavaScript är väldigt löst definierat, medan TypeScript är ganska väl definierat. Utan att ändra den befintliga .d.ts-filen, eller skriva din egen, är alternativen begränsade. Teoretiskt sett borde följande fungera:

pb['decode'](buffer)

Men du nämnde att det inte gjorde det. Din lösning med att sätta en mellanliggande variabel fungerar bra:

var decoder: any = pb["decode"];
decoder(buffer);

Den här koden liknar den andra lösningen, som är att helt enkelt deklarera pb som any. Följande kod gör detta inline:

(<any>pb).decode(buffer);

Den här koden berättar i princip för TypeScript-kompilatorn att "bara låtsas att pb är något som har en decode-metod, eller vad som helst".

Relaterade artiklar