javascript - TypeScript'te Modüller Nasıl Doğru Şekilde İhraç ve İçe Aktarılır


Not: Bu konuda birçok gönderi olduğunu biliyorum ve başarılı olamadan oldukça fazlasını inceledim (lütfen gönderinin sonunda yer alan referanslarıma bakınız).

Visual Studio Code kullanarak TypeScript'te çok basit bir test çalıştırmaya çalışıyorum; bir dosyada bir sınıf tanımlayıp onu başka bir dosyaya aktarıyorum. Ancak, aktardığım dosyadaki sınıfın yöntemlerini tanımayan bir sorunla sürekli karşılaşıyorum.

Şu anda aldığım tam hata mesajları şunlardır:

[ts] 'getFirstName' özelliği, 'typeof "module-test/src/OtherClass"' türünde mevcut değil.

[ts] 'getLastName' özelliği 'typeof "module-test/src/OtherClass"' türünde mevcut değil.

Node 9.3.0 ve TypeScript 2.6.2 kullanıyorum.

Herhangi bir rehberlik sunabilecek olan herkese şimdiden çok teşekkür ederim!

main.ts

import * as Other from "./OtherClass";

class myApp
{
  public async start()
  {
    console.log("Starting application");
    
    try
    {
      let firstName = await Other.getFirstName();
      console.log("First Name: " + firstName);
      let lastName = await Other.getLastName();
      console.log("Last Name: " + lastName);
    }
    catch (error)
    {
      console.error("Unable to get name: " + error)
    }
    
    console.log("Ending application");
  }
}

const app = new myApp();
app.start();

OtherClass.ts

class Other
{
  getFirstName(): string
  {
    return "John";
  }

  getLastName(): string
  {
    return "Doe";
  }
}

export { Other };

Denediğim Şeyler

  1. Beyanname ile ihracat

export class Other
{
  getFirstName(): string
  {
    return "John";
  }

  getLastName(): string
  {
    return "Doe";
  }
}
  1. Bireysel işlevleri dışa aktarmak

class Other
{
  export function getFirstName(): string
  {
    return "John";
  }

  export function getLastName(): string
  {
    return "Doe";
  }
}
  1. Birden fazla dışa aktarma bildirimi

module.exports = Other;
export { Other };
export * from "OtherClass";
  1. Birden fazla ithalat bildirimi

import * as Other from "./OtherClass";
import { Other } from "./OtherClass";

Yapılandırma Dosyaları package.json

{
  "name": "module-test",
  "version": "1.0.0",
  "description": "Simple test of exporting and importing modules",
  "main": "./lib/main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "John Doe",
  "license": "ISC",
  "dependencies": {
    "typescript": "^2.6.2"
  },
  "devDependencies": {
    "@types/node": "^8.5.2",
    "@types/typescript": "^2.0.0"
  }
}

tsconfig.json

{
  "compilerOptions": {
    /* Basic Options */
    "target": "es2016",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "outDir": "./lib/",                        /* Redirect output structure to the directory. */
    "strict": true,                            /* Enable all strict type-checking options. */
    "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
    "inlineSources": true                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
  }
}

Referans Verilen Makaleler

  • Tür '"http"' üzerinde 'Server' özelliği mevcut değil
  • Node.js ES6 modülden sınıf nasıl dışa aktarılır?
  • CommonJs Modül Sisteminde "module.exports" ile "exports" arasındaki fark
  • TypeScript'te node modüllerini doğru şekilde nasıl oluşturup içe aktarılır
  • TypeScript - Modülleri dışa aktar ve içe aktar
  • https://www.typescriptlang.org/docs/handbook/modules.html

Cevap #1

Nereden başlanmalı? Bu, geçerli bir programdan çok uzak; muhtemelen çalışan bir örnekle başlamalısınız çünkü bu kodun ne yapmasını istediğiniz %100 net değil.

Tek bir isimli ihraca sahip bir modül oluşturdunuz, sınıf Other.

export { Other };

Daha sonra çevreleyen modül nesnesini içe aktardınız:

import * as Other from "./OtherClass";

İçe aktarma dosyasında, sınıfın adı artık Other.Other. Ancak kodun hiçbir yerinde sınıfı gerçekten örneklemediniz (new)! Yani burada

let firstName = await Other.getFirstName();

Yazmanız gerekiyor

const oth = new Other.Other();

Bu elbette saçma görünüyor. İçe aktarma ifadesini değiştirin (birden fazla olmayacak şekilde!)

import { Other } from "./OtherClass";

Ve şimdi bunun yerine yazabilirsiniz

const oth = new Other();

Devam edelim, yazıyoruz

let firstName = await oth.getFirstName();

Bunun dışında, getFirstName bir asenkron fonksiyon değil, bu yüzden gerçekten şu şekilde yazmalısınız

let firstName = oth.getFirstName();

İlgili makaleler