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
- Beyanname ile ihracat
export class Other
{
getFirstName(): string
{
return "John";
}
getLastName(): string
{
return "Doe";
}
}- Bireysel işlevleri dışa aktarmak
class Other
{
export function getFirstName(): string
{
return "John";
}
export function getLastName(): string
{
return "Doe";
}
}- Birden fazla dışa aktarma bildirimi
module.exports = Other;
export { Other };
export * from "OtherClass";- 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();
