2016-01-29 23 views
16

Tôi có một ứng dụng Node.js rằng gắn một số thông tin cấu hình cho global đối tượng:Mở rộng đối tượng nguyên cảo toàn cầu trong Node.js

global.myConfig = { 
    a: 1, 
    b: 2 
} 

Trình biên dịch nguyên cảo không thích điều này vì kiểu Global không có đối tượng có tên myConfig:

TS2339: Thuộc tính 'myConfig' không tồn tại trên loại 'Toàn cầu'.

tôi không muốn làm điều này:

global['myConfig'] = { ... } 

Làm thế nào để mở rộng hoặc loại Global chứa myConfig hoặc chỉ nói typescript để im lặng và tin tưởng tôi? Tôi thích cái đầu tiên.

Tôi không muốn thay đổi các khai báo bên trong node.d.ts. Tôi thấy điều này SO post và cố này:

declare module NodeJS { 
    interface Global { 
     myConfig: any 
    } 
} 

như một cách để mở rộng giao diện hiện Global, nhưng nó dường như không có hiệu lực.

Trả lời

22

Tôi thấy điều này SO gửi và cố này:

Bạn có thể có một cái gì đó giống như vendor.d.ts:

// some import 
// AND/OR some export 

declare module NodeJS { 
    interface Global { 
     spotConfig: any 
    } 
} 

tập tin của bạn cần phải được sạch của bất kỳ cấp cơ import hoặc exports . Điều đó sẽ biến tệp thành mô-đun và ngắt kết nối khỏi không gian tên khai báo loại toàn cầu toàn cầu.

thêm: https://basarat.gitbooks.io/typescript/content/docs/project/modules.html

+0

Đóng đinh nó, cảm ơn – d512

+0

Cảm ơn bạn đời – basarat

+1

Tôi không thể hình dung điều này. Tôi không có một vendor.d.ts, vì vậy tôi đã thực hiện một, nhưng nó dường như không có hiệu lực. Tôi có nên nhập nó không? – Justin

8

Để tránh điều gì đó khẳng định nguyên cảo như thế này:

TS2339: Sở hữu 'myConfig' không tồn tại trên loại 'toàn cầu'.

Tôi khuyên bạn nên xác định các loại tùy chỉnh. Tôi làm điều đó dưới src/types/custom.d.ts tập tin trong dự án của tôi:

declare global { 
    namespace NodeJS { 
    interface Global { 
     myConfig: { 
      a: number; 
      b: number; 
     } 
    } 
    } 
} 

Sau đó, tôi đảm bảo chúng được xem xét bản sao vào tsconfig.json file:

{ 
    ... 
    "files": [ 
    ... 
    "src/types/custom.d.ts" 
    ] 
} 

Bây giờ bạn đã an toàn để sử dụng tài sản tùy chỉnh của bạn:

console.log(global.myConfig.a); 
+2

Đây là câu trả lời hay hơn. Cũng như việc mở rộng phía máy khách 'Window' nên sử dụng' khai báo global'. –

+0

Điều này tốt hơn, tnx. có bất kỳ tài liệu nào về cú pháp này, 'khai báo global' không? – Leon

3

Đặt tệp sau vào thư mục gốc của dự án của chúng tôi đã hoạt động.

global.d.ts

declare namespace NodeJS { 
    export interface Global { 
    myConfig: any 
    } 
} 

Chúng tôi đang sử dụng "@types/node": "^7.0.18" và TypeScript Version 2.3.4. tập tin tsconfig.json của chúng tôi trông như thế này:

{ 
    "compilerOptions": { 
     "module": "commonjs", 
     "target": "es6" 
    }, 
    "exclude": [ 
     "node_modules" 
    ] 
} 
+0

Điều này làm việc tuyệt vời cho tôi. Tôi tự hỏi tại sao bỏ phiếu xuống. – PigBoT

+0

@PigBoT Sự sụt giảm xảy ra ở đâu? Tôi không thấy một câu trả lời nào cả. –

0

Điều duy nhất làm việc cho tôi là thế này:

// lib/my.d.ts

import Global = NodeJS.Global; 
export interface CDTGlobal extends Global { 
    cdtProjectRoot: string 
} 

và sau đó sử dụng nó trong các tệp khác như vậy

import {CDTGlobal} from "../lib/my.d.ts"; 
declare const global: CDTGlobal; 

const cwd = global.cdtProjectRoot; // works 
Các vấn đề liên quan