ES6 xuất tất cả các giá trị từ đối tượng


112

Giả sử tôi có một mô-đun ( ./my-module.js) có một đối tượng phải là giá trị trả về của nó:

let values = { a: 1, b: 2, c: 3 }

// "export values" results in SyntaxError: Unexpected token

Vì vậy, tôi có thể nhập chúng như:

import {a} from './my-module'           // a === 1
import * as myModule from './my-module' // myModule.a === 1

Cách duy nhất tôi tìm thấy là mã hóa các tệp xuất:

export let a = values.a
export let b = values.b
export let c = values.c
// or:
export let {a, b, c} = values

Mà không phải là động.

Có thể xuất tất cả các giá trị từ một đối tượng không?


6
Không, vì không thể xuất tĩnh giá trị được tính toán động.
Bergi

@Bergi, tôi đang tự hỏi liệu bằng cách nào đó có thể làm cho các giá trị tĩnh bằng cách nào đó. Tôi đã nghĩ về những gì nếu bạn sử dụng một interface { a: number, b: number, c: number }? Về mặt lý thuyết thì điều đó là có thể, phải không?
Fleuv 19/09/19

1
@Fleuv export const {a, b, c} = valueschính xác là cú pháp để khai báo giao diện tĩnh đó
Bergi 19/09/19

Câu trả lời:


39

Không có vẻ như vậy. Trích dẫn từ mô-đun ECMAScript 6: cú pháp cuối cùng :

Bạn có thể tự hỏi - tại sao chúng ta cần xuất khẩu được đặt tên nếu chúng ta có thể chỉ đơn giản là xuất các đối tượng mặc định (như CommonJS)? Câu trả lời là bạn không thể thực thi một cấu trúc tĩnh thông qua các đối tượng và mất tất cả các lợi thế liên quan (được mô tả trong phần tiếp theo).


3
Bạn có thể sử dụng một mảng nếu chúng có các cặp tên-giá trị không?
Kevin Suttle

79

Tôi thực sự không thể giới thiệu giải pháp này nhưng nó hoạt động. Thay vì xuất một đối tượng, bạn sử dụng xuất có tên cho từng thành viên. Trong một tệp khác, nhập các bản xuất có tên của mô-đun đầu tiên vào một đối tượng và xuất đối tượng đó theo mặc định. Đồng thời xuất tất cả các xuất được đặt tên từ mô-đun đầu tiên bằng cách sử dụngexport * from './file1';

giá trị / value.js

let a = 1;
let b = 2;
let c = 3;

export {a, b, c};

giá trị / index.js

import * as values from './value';

export default values;
export * from './value';

index.js

import values, {a} from './values';

console.log(values, a); // {a: 1, b: 2, c: 3} 1

2
Tại sao bạn không giới thiệu điều này?
jsdario

2
Có lẽ vì cách chữa bệnh còn tồi tệ hơn căn bệnh (trừ khi bạn đang viết một thư viện có thể tiêu thụ công khai và bạn thực sự kén chọn cách nhập của nó)?
machineghost

Vâng, đó là một bản tóm tắt hay. Đó là một kỹ thuật tôi đã sử dụng một lần trong thư viện để dễ tiêu thụ. Tôi nghĩ sẽ tốt hơn nếu quản lý các bản xuất trong một tệp duy nhất mặc dù công việc của tác giả thư viện nhiều hơn. Kết quả là độ sâu mô-đun ít hơn một chút cho người dùng.
ryanjduffy

Tôi khá thích cách làm việc này, nhưng nó phải là './value' thay vì './values' trong giá trị / index.js, phải không?
Jan Paepke

1
Tôi thực sự không nghĩ đây là câu trả lời, vì nếu tôi đã xuất rồi { a, b, c }, tại sao tôi cần phải xuất lại? Câu hỏi thực sự là nếu tôi chỉ có const obj = { a, b, c }và tôi có thể xuất tất cả thành viên của obj không? Tôi đoán câu trả lời là KHÔNG.
windmaomao

14

hãy thử giải pháp xấu xí nhưng khả thi này:

// use CommonJS to export all keys
module.exports = { a: 1, b: 2, c: 3 };

// import by key
import { a, b, c } from 'commonjs-style-module';
console.log(a, b, c);

12

Tôi chỉ cần làm điều này cho một tệp cấu hình.

var config = {
    x: "CHANGE_ME",
    y: "CHANGE_ME",
    z: "CHANGE_ME"
}

export default config;

Bạn có thể làm điều đó như thế này

import { default as config } from "./config";

console.log(config.x); // CHANGE_ME

Điều này đang sử dụng Typescript nhớ bạn.


34
Bạn sẽ có thể làm đượcimport config from './config';
Matt Hamann

4
export const a = 1;
export const b = 2;
export const c = 3;

Điều này sẽ hoạt động với các chuyển đổi Babel ngay hôm nay và sẽ tận dụng tất cả các lợi ích của mô-đun ES2016 bất cứ khi nào tính năng đó thực sự có trong trình duyệt.

Bạn cũng có thể thêm export default {a, b, c};mà sẽ cho phép bạn nhập tất cả các giá trị dưới dạng một đối tượng w / o * as, tức làimport myModule from 'my-module';

Nguồn:


3

Tôi đề xuất những điều sau, hãy mong đợi một module.js :

const values = { a: 1, b: 2, c: 3 };

export { values }; // you could use default, but I'm specific here

và sau đó bạn có thể làm trong index.js :

import { values } from "module";

// directly access the object
console.log(values.a); // 1

// object destructuring
const { a, b, c } = values; 
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

// selective object destructering with renaming
const { a:k, c:m } = values;
console.log(k); // 1
console.log(m); // 3

// selective object destructering with renaming and default value
const { a:x, b:y, d:z = 0 } = values;
console.log(x); // 1
console.log(y); // 2
console.log(z); // 0

Các ví dụ khác về việc hủy đối tượng: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destosystem_assignment#Object_dest Structure


3

Mọi câu trả lời đều yêu cầu thay đổi các câu lệnh nhập.

Nếu bạn muốn có thể sử dụng:

import {a} from './my-module'           // a === 1
import * as myModule from './my-module' // myModule.a === 1

như trong câu hỏi và trong my-modulebạn có mọi thứ cần xuất trong một đối tượng (có thể hữu ích, ví dụ: nếu bạn muốn xác thực các giá trị đã xuất bằng Joi hoặc JSON Schema) thì bạn my-modulesẽ phải:

let values = { a: 1, b: 2, c: 3 }
let {a, b, c} = values;
export {a, b, c};

Hoặc là:

let values = { a: 1, b: 2, c: 3 }
export let {a, b, c} = values;

Không đẹp, nhưng nó biên dịch theo những gì bạn cần.

Xem: Ví dụ về Babel


3

2

Xuất từng biến từ tệp biến của bạn. Sau đó, nhập chúng bằng * như trong tệp khác của bạn và xuất dưới dạng hằng số từ tệp đó sẽ cung cấp cho bạn một đối tượng động với các xuất được đặt tên từ tệp đầu tiên là thuộc tính trên đối tượng được xuất từ ​​tệp thứ hai.

Variables.js

export const var1 = 'first';
export const var2 = 'second':
...
export const varN = 'nth';

Other.js

import * as vars from './Variables';

export const Variables = vars;

Third.js

import { Variables } from './Other';

Variables.var2 === 'second'

Bạn cũng có thể vui lòng thêm lời giải thích?
Nilambar Sharma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.