node.js - Får fel TS2304: Kan inte hitta namnet 'Buffer'
Jag försöker göra base64-kodning i NodeJS med TypeScript.
Följande kod fungerar bra i JavaScript.
När jag skriver samma sak i TypeScript och kompilerar, får jag felet Buffer hittas inte.
var base64Policy = new Buffer(stringPolicy, 'utf-8').toString('base64');
Kan någon hjälpa mig att göra samma sak i TypeScript.
Svar #1
För IONIC 4-utvecklarna installerade jag det med
npm install --save @types/node
När jag försökte lägga till "types": ["node"] som visas nedan
"compilerOptions": {
"outDir": "./out-tsc/app",
"types": ["node"]
},
till
tsconfig.json
det fungerade inte. Jag var tvungen att lägga till posten i
tsconfig.app.json
Vänligen se följande länk för relevant dokumentation.
https://github.com/aws/aws-sdk-js/issues/1271#issuecomment-291658668
Låt mig veta om det fungerade för dig!
Svar #2
Lägg till den här raden högst upp:
declare const Buffer
och det bör kompileras utan fel.
Deklarationer krävs för att använda nodes inbyggda bibliotek eller andra globala objekt, du kan manuellt deklarera det som ovan.
Med den nya versionen av Typescript kan du också använda officiella deklarationsfiler:
npm i -g typescript@next
npm i --save-dev @types/node
för andra bibliotek, installera @types/library_name.
mer information: Förbättra förvärv av deklarationsfiler, Framtiden för deklarationsfiler
Svar #3
Prolog
Buffer är en del av Node.js API. Eftersom TypeScript inte känner till klasser från Node.js som standard måste du installera deklarationsfiler (typdefinitioner) för Node.js.
Om du ser följande fel måste du installera typdefinitioner manuellt:
fel TS2304: Kan inte hitta namnet 'Buffer'.
Installerar typdefinitioner
Du kan installera typdefinitioner med verktyget typings. Jag kommer att visa dig hur man gör detta:
Installera
typings-verktyget med npm:npm install -g typingsInstallera typdefinitioner för Node.js från DefinitelyTyped (
~dt)-arkivet:typings install dt~node --global --save
Typningsverktyget kommer att skapa följande katalog "typings/globals/node" och länka den i "typings/index.d.ts". Det kommer även att finnas en fil som heter typings.json (på grund av --save-alternativet), som refererar de upplösta typdefinitionerna:
{
"globalDependencies": {
"node": "registry:dt/node#6.0.0+20160621231320"
}
}
Notera: Om du ser felet "typings\globals\node\index.d.ts(71,26): error TS1110: Type expected", då är din Node.js-definition för ny. Typings-verktyget har problem med de senaste typdeklarationerna. I ett sådant fall, kontrollera bara versionen i din typings.json-fil. För mig fungerade node#6.0.0+20160621231320 men node#6.0.0+20161212163245 gjorde det inte.
- Nu behöver du bara lägga till
index.d.tssom en triple-slash-direktiv i din kod (som använderBuffer-klassen):
DinKlass.ts
/// <reference path="../../typings/index.d.ts" />
export class YourClass {
private static toString(encoded: string): string {
return new Buffer(encoded, "base64").toString();
}
}
UPPDATERING:
Med lanseringen av TypeScript 2.0 har ett nytt system för typspecifikationer tillkännagivits.
Du kan nu glömma bort typings-verktyget. Allt du behöver göra är att köra detta kommando för att installera TypeScript-definitioner för Node.js:
npm install --save @types/nodeSe också till att du har följande poster i din tsconfig.json:
{
"compilerOptions": {
"moduleResolution": "node",
...
},
"exclude": [
"node_modules",
...
]
}
P.S. Om du behöver typdefinitioner för andra klasser (än de som ingår i Node.js), kan du söka efter dem här: http://microsoft.github.io/TypeSearch/
Svar #4
För Angular-användare:
- Kör följande kommando
npm install --save @types/node- I din
tsconfig.app.json-fil, lägg till dessa två rader i CompilerOptions:
"compilerOptions": {
//...
"types": ["node"],
"typeRoots": ["node_modules/@types"]
}
Svar #5
Buffer är från Node-namnrymden. Installera först
npm install --save @types/node
lägg sedan till följande kod i din tsconfig.json-fil i avsnittet compilerOptions
"types": ["node"],
"typeRoots": ["node_modules/@types"]
Posten typeRoots anger en lista över kataloger för typdefinitionsfiler som ska inkluderas. Den kräver TypeScript version 2.0 eller senare.
