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".
