Definitelytyped: React ES6 ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ์ œ

์— ๋งŒ๋“  2015๋…„ 07์›” 29์ผ  ยท  27์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: DefinitelyTyped/DefinitelyTyped

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•œ๋‹ค:
import React, {Component} from 'react';

ํ•˜์ง€๋งŒ ์ด ์œ ํšจํ•œ ES6 ๋™์ž‘์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด react.d.ts ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
error TS1192: Module '"react"' has no default export.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” allowSyntheticDefaultImports ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import React, {Component} from 'react';

๋ชจ๋“  27 ๋Œ“๊ธ€

export default react = React; ์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์ด import * as React, {Component} from 'react'; ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์ตœ๊ทผ์— ES6์— ๊ฝค ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ํ˜„์žฌ import React from 'react'; ๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ์œ ํšจํ•œ ๋™์ž‘์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. React๋Š” ES6 ํด๋ž˜์Šค ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์€ Babel์„ ์‚ฌ์šฉํ•  ๋•Œ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ Babel์ด "CommonJS ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ES6 ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” modules.export ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ „์ ์œผ๋กœ Babel์ด๊ณ  ์‚ฌ์–‘์˜ ๊ด€์ ์—์„œ ๋‚˜๋Š” import * as React from 'react'; ๊ฐ€ ์‹ค์ œ๋กœ ์ •์‹ ์— ํ›จ์”ฌ ๊ฐ€๊น๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ TypeScript์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค).

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์™„์ „ํžˆ Babel์˜ ๊ฒƒ์ด์ง€ ์‚ฌ์–‘์˜ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์˜. ๊ทธ๋Ÿฌ๋‚˜ babel์€ _๋งŽ์€_ ๋งค๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์‚ฌ๋žŒ๋“ค์€ ES6 ๋ชจ๋“ˆ์ด _๋ฐ˜๋“œ์‹œ_ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

@vvakame ์€ babel ์œ ํ˜• ๊ฐ€์ ธ์˜ค๊ธฐ์™€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์›ํ™œํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/pull/3586

์˜ˆ, PR์ด ์ฃผ๋กœ TypeScript์—์„œ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” TypeScript๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๊ทธ PR์€ ์ด ๋ฌธ์ œ์— ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ TypeScript๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ๋Š” ํ™•์‹คํžˆ ์ข‹์Šต๋‹ˆ๋‹ค!).

๋‚˜๋Š” Babel์ด Facebook์— ์ธ์ˆ˜๋˜๋ฉด์„œ ์ด ๋ฌธ์ œ๊ฐ€ ๊ณง ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  React๊ฐ€ ES6 ๋ชจ๋“ˆ๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๋”๋ผ๋„ ์ „ํ˜€ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” ํ•ด๋‹น ๊ตฌ๋ฌธ์„ _์ •๋ง__ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ ์–ธ ํŒŒ์ผ์„ export default React ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ES6์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ ๋‹ค์Œ Babel์„ ์‚ฌ์šฉํ•˜์—ฌ CommonJS๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„์— ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(TypeScript๋Š” ES6 ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•ญ์ƒ moduleName.default ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ts export -> babel import ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ module.exports aliased to default -> ts import ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŒŒํ‹ฐ์— ์กฐ๊ธˆ ๋Šฆ์—ˆ์ง€๋งŒ ๋‚ด๊ฐ€ ์•„๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ์ด๊ฒƒ์€ TypeScript ํŒ€์˜ ์ž˜๋ชป๋œ ์ˆ˜์ • ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

tl;dr: export default ๋ฅผ module.exports = ๋กœ ๋ฒˆ์—ญํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  import ... = require(...) ๋ ˆ๊ฑฐ์‹œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค :(

ES-6 ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฆ„์ด 'default' ์ธ ์ผ๋ฐ˜ ๋‚ด๋ณด๋‚ด๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— CJS์—์„œ ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ์€ exports.default = ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” CJS var something = require('something').default ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. module.exports = ๊ตฌ๋ฌธ์€ ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ธ ๊ธฐํ˜ธ ์ž์ฒด์™€ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ˆœํ™˜ ์ข…์†์„ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ES6 ๋ชจ๋“ˆ์˜ ์„ค๊ณ„์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. IMHO Babel ํŒ€์€ ์ด๊ฒƒ์œผ๋กœ ์•ฝ๊ฐ„ ๊ณผ์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค :(

@dreampulse ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

import {default as React,Component} from 'react';

๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” @kataras :

Error:(2, 9) TS2305: Module '"react"' has no exported member 'default'.

์•”ํ˜ธ

import {default as React, Component, PropTypes} from 'react';

tsconfig.json

{
  "compileOnSave": true,
  "compilerOptions": {
    "target": "es6",
    "sourceMap": true,
    "jsx": "react"
  }
}

์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ์ž…๋‹ˆ๋‹ค. ์ฒ˜๋Ÿผ:

import * as React from "react";
import { Component } from "react";

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” allowSyntheticDefaultImports ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import React, {Component} from 'react';

@jbrantly ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์— ๋”ฑ ๋งž๋‹ค!!

@ligaz ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ฐธ๊ณ ๋กœ @ligaz ๊ฐ€ ์–ธ๊ธ‰ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๊ธฐ ์ „์— "module": "es2015", ๋ฅผ tsconfig.json ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

import React, {Component, PropTypes} from 'react'; ์„(๋ฅผ) ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ Cannot resolve symbol PropTypes ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@kkarmalkar React >=15.5.0์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ React.PropTypes์—์„œ ์ƒˆ๋กœ์šด prop-types ํŒจํ‚ค์ง€ ๋ฐ ์ •์˜ ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @corydeppen

๋‚˜๋Š” allowSyntheticDefaultImports๊ฐ€ ์žˆ์ง€๋งŒ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

import React, {Component} from 'react';

์ž‘๋™ํ•˜์ง€๋งŒ ์‚ฌ์šฉ

import React from 'react';
import {Component} from 'react';

์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ชจ๋“ˆ์„ es5๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์šฉ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ es6์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๊นŒ? tsconfig.json์˜ libs ์†์„ฑ์— es2015๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

@richtera ๊ด€๋ จ ๊ฐ€๋Šฅ์„ฑ: https://github.com/Microsoft/TypeScript/issues/21621

๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค, ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

tsconfig ์˜ต์…˜ esModuleInterop: true ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ธฐ๋ณธ ๊ฐ€์ ธ์˜ค๊ธฐ(์˜ˆ: import React from 'react' )๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์„ค์ •์œผ๋กœ babel์„ ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹œ ์‚ฌ์šฉํ•˜๋˜ ํŠน์ • ๋ฒ„์ „์˜ webpack ๋ฐ typescript์™€ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Babel ์„ค์ •์€ ๋ถˆํ–‰ํžˆ๋„ ์—ฌ์ „ํžˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹Œ babel์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

"allowSyntheticDefaultImports": ์ฐธ

"module": "es2015
โ€œallowSyntheticDefaultImportsโ€๏ผštrue

์ผํ•˜๊ณ ์žˆ๋Š” ....

"module": "es2015
โ€œallowSyntheticDefaultImportsโ€๏ผštrue

์ผํ•˜๊ณ ์žˆ๋Š” ....

์ด๊ฒŒ ํŠธ๋กค์ด์•ผ? :) ๋งˆ์ง€๋ง‰ ์ค„์— ๋ฐฉํ–ฅ ๋”ฐ์˜ดํ‘œ๊ฐ€ ์žˆ๊ณ  true ์•ž์— ์ฝœ๋ก ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  "module": "es2015",
  "allowSyntheticDefaultImports": true

import { default as ProjectInfoProfile } from './ProjectInfoProfile';
๋˜๋Š”
'./ProjectInfoProfile'์—์„œ ProjectInfoProfile์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"๋ชจ๋“ˆ": "commonjs",
"๋Œ€์ƒ": "es6",
"esModuleInterop": ์ฐธ,
"jsx": "๋ฐ˜์‘",
"allowSyntheticDefaultImports": ์ฐธ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰