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:

  1. Installera typings-verktyget med npm:

    npm install -g typings
  2. Installera 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.

  1. Nu behöver du bara lägga till index.d.ts som en triple-slash-direktiv i din kod (som använder Buffer-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/node

Se 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:

  1. Kör följande kommando
npm install --save @types/node
  1. 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.

Relaterade artiklar