ES6 tüm değerleri nesneden dışa aktarır


112

./my-module.jsDönüş değeri olması gereken bir nesneye sahip bir modülüm ( ) olduğunu varsayalım:

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

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

Böylece onları şu şekilde içe aktarabilirim:

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

Bulduğum tek yol, dışa aktarımları sabit kodlamak:

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

Dinamik olmayan.

Bir nesneden tüm değerleri dışa aktarmak mümkün mü?


6
Hayır, çünkü dinamik olarak hesaplanan değer statik olarak dışa aktarılamaz.
Bergi

@Bergi, değerleri bir şekilde statik hale getirmenin bir şekilde mümkün olup olmadığını merak ediyorum. Bir kullanırsam ne düşünüyordum interface { a: number, b: number, c: number }? Teorik olarak mümkün olmalı, değil mi?
Fleuv

1
@Fleuv export const {a, b, c} = values, tam da statik arabirimi bildiren sözdizimidir
Bergi

Yanıtlar:


39

Öyle görünmüyor. ECMAScript 6 modüllerinden alıntı : son sözdizimi :

Merak ediyor olabilirsiniz - nesneleri (CommonJS gibi) varsayılan olarak dışa aktarabiliyorsak neden adlandırılmış dışa aktarmalara ihtiyacımız var? Cevap, nesneler aracılığıyla statik bir yapıyı uygulayamayacağınız ve ilişkili tüm avantajları kaybedemeyeceğinizdir (bir sonraki bölümde açıklanmıştır).


3
İsim-değer çiftleri varsa bir dizi kullanabilir misiniz?
Kevin Suttle

79

Bu çözümü gerçekten tavsiye edemem ama işe yarıyor. Bir nesneyi dışa aktarmak yerine, her üyeye adlandırılmış dışa aktarmalar kullanırsınız. Başka bir dosyada, ilk modülün adlandırılmış dışa aktarımlarını bir nesneye içe aktarın ve bu nesneyi varsayılan olarak dışa aktarın. Ayrıca, tüm adlandırılmış dışa aktarmaları kullanarak ilk modülden dışa aktarınexport * from './file1';

değerler / value.js

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

export {a, b, c};

değerler / 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
Neden bunu önermiyorsun?
jsdario

2
Belki de tedavi hastalıktan daha kötü olduğu için (herkesin kullanımına açık bir kitaplık yazmıyorsanız ve nasıl ithal edildiği konusunda gerçekten seçici değilseniz)?
machineghost

Evet, bu iyi bir özet. Bu, tüketilebilirliği kolaylaştırmak için kitaplıkta bir kez kullandığım bir teknik. Kütüphane yazarı için daha fazla iş olsa da dışa aktarımları tek bir dosyada yönetmenin daha iyi olacağını düşünüyorum. Sonuç, kullanıcı için bir daha az modül derinliğidir.
ryanjduffy

Bu çalışmayı çok seviyorum, ancak values ​​/ index.js'de "./values" yerine "./value" olmalı, değil mi?
Jan Paepke

1
Cevabın bu olduğunu gerçekten düşünmüyorum, çünkü zaten ihracat { a, b, c }yapıyorsam neden tekrar ihraç etmem gerekiyor? Asıl soru, ya sadece const obj = { a, b, c }sahipsem ve obj'in tüm üyelerini dışa aktarabilir miyim? Sanırım cevap HAYIR.
windmaomao

14

bu çirkin ama işe yarar çözümü deneyin:

// 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

Bunu bir yapılandırma dosyası için yapmam gerekiyordu.

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

export default config;

Bunu böyle yapabilirsin

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

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

Bu, Typescript'i kullanmaktır.


34
Yapacak gerekirimport config from './config';
Matt Hamann

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

Bu, bugün Babel dönüşümleriyle birlikte çalışacak ve bu özellik aslında bir tarayıcıya geldiğinde ES2016 modüllerinin tüm avantajlarından yararlanacaktır.

Ayrıca ekleyebilir export default {a, b, c};Eğer w / o bir nesne olarak tüm değerleri almak sağlayacak olan * as, yaniimport myModule from 'my-module';

Kaynaklar:


3

Aşağıdakileri öneriyorum, bir module.js bekleyelim :

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

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

ve sonra bir index.js'de yapabilirsiniz :

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

Yıkıcı nesnelerin daha fazla örneği: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring


3

Her yanıt, ithalat ifadelerinin değiştirilmesini gerektirir.

Kullanabilmek istiyorsanız:

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

soruda olduğu gibi ve my-modulesizin için ihtiyacınız olan her şeye tek bir nesnede sahip olacaksınız (bu yararlı olabilir, örneğin, dışa aktarılan değerleri Joi veya JSON Şeması ile doğrulamak istiyorsanız), o zaman şunlardan biri my-moduleolmalıdır:

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

Veya:

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

Hoş değil ama ihtiyacınız olana göre derleniyor.

Bakınız: Babel örneği


3

2

Değişken dosyanızdaki her değişkeni dışa aktarma. Daha sonra bunları diğer dosyanızda olduğu gibi * ile içe aktarmak ve o dosyadan sabit olarak dışa aktarmak size, birinci dosyadan dışa aktarılan ikinci dosyadaki öznitelikler olan adlandırılmış dışa aktarmalara sahip dinamik bir nesne verecektir.

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'

Lütfen açıklama da ekleyebilir misiniz?
Nilambar Sharma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.