Typescript: TS4023 : λ‚΄ 보낸 λ³€μˆ˜ 'X'에 μ™ΈλΆ€ λͺ¨λ“ˆ 'a / file / path'의 이름 'Y'κ°€ μžˆκ±°λ‚˜ μ‚¬μš© μ€‘μ΄μ§€λ§Œ 이름을 지정할 수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2015λ…„ 11μ›” 18일  Β·  24μ½”λ©˜νŠΈ  Β·  좜처: microsoft/TypeScript

λ‹€μŒκ³Ό 같이 μ™ΈλΆ€ TypeScript λͺ¨λ“ˆ 집합을 λ§Œλ“€λ €κ³ ν•©λ‹ˆλ‹€.

// ClassA.ts
export default class ClassA {
  public method() { return true; } 
}

// ModuleB.ts
import ClassA from './ClassA';
var moduleB = {
  ClassA: ClassA
};
export default moduleB;

// ModuleA.ts
import moduleB from './ModuleB';
var moduleA = {
  moduleB: moduleB
}
export default moduleA;

μ•„μ΄λ””μ–΄λŠ” 이것이 μ»΄νŒŒμΌλ˜μ–΄ 라이브러리둜 μ œκ³΅λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. κ³„νšμ€ 라이브러리 μ†ŒλΉ„μžκ°€ λ‹€μŒκ³Ό 같이 ClassA μΈμŠ€ν„΄μŠ€λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

import moduleA from './ModuleA';
var anInstance = moduleA.moduleB.ClassA();

이것은 μ˜ˆμƒλ˜λŠ” JS둜 μ»΄νŒŒμΌν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μΆ”κ°€ 정보λ₯Ό μ°ΎκΈ° μœ„ν•΄ κ³ κ΅°λΆ„νˆ¬ν•˜λŠ” 였λ₯˜ 컴파일러 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

Using tsc v1.6.2
.../src/ModuleA.ts(3,5): error TS4023: Exported variable 'moduleA' has or is using name 'ClassA' from external module ".../src/ClassA" but cannot be named.

μ—¬κΈ° λˆ„κ΅¬λ“ μ§€μ΄ λ¬Έμ œμ— λŒ€ν•΄ 밝힐 수 μžˆμŠ΅λ‹ˆκΉŒ? λ‚΄κ°€ν•˜λ €λŠ” 것이 이해가 λ˜λ‚˜μš”?

Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

FWIWλŠ” 일반적으둜 Stack Overflowμ—μ„œ 더 λΉ λ₯Έ 닡변을 얻을 수 μžˆμ§€λ§Œ μ—¬κΈ°μ„œλŠ” ν•„λ“œμ— 잘 ν‘œν˜„ 된 μ§ˆλ¬Έμ„ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ¬Έμ œλŠ” --declaration ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ μ»΄νŒŒμΌλŸ¬κ°€ μž‘μ—…μ„ μˆ˜ν–‰ ν•  μˆ˜μžˆλŠ” 방법을 μ œκ³΅ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

ModuleA.d.ts λ₯Ό 내보내렀고 ν•  λ•Œ μ»΄νŒŒμΌλŸ¬λŠ” λͺ¨λ“ˆμ˜ λͺ¨μ–‘을 λ‚˜νƒ€λ‚΄λŠ” 객체 μœ ν˜• λ¦¬ν„°λŸ΄ (예 : { moduleB: { classA: *mumble?* } } )을 μž‘μ„±ν•΄μ•Όν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ classA 직접 μ°Έμ‘°ν•˜λŠ” 이름이 λ²”μœ„μ— μ—†μœΌλ―€λ‘œ "이름을 지정할 수 μ—†μŒ"μœ ν˜•μ΄λ©° 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

import of ClassA λ₯Ό ModuleA.ts 에 μΆ”κ°€ν•˜λ©΄ 였λ₯˜κ°€ μ‚¬λΌμ§‘λ‹ˆλ‹€.

λͺ¨λ“  24 λŒ“κΈ€

였-이것이이 μ§ˆλ¬Έμ„ν•˜κΈ°μ— μ ν•©ν•œ μž₯μ†Œκ°€ μ•„λ‹ˆλΌλ©΄. μ•Œλ € μ£Όμ‹œλ©΄ λ‹€λ₯Έ 맀체에 κ²Œμ‹œ ν•΄ λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

FWIWλŠ” 일반적으둜 Stack Overflowμ—μ„œ 더 λΉ λ₯Έ 닡변을 얻을 수 μžˆμ§€λ§Œ μ—¬κΈ°μ„œλŠ” ν•„λ“œμ— 잘 ν‘œν˜„ 된 μ§ˆλ¬Έμ„ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ¬Έμ œλŠ” --declaration ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ μ»΄νŒŒμΌλŸ¬κ°€ μž‘μ—…μ„ μˆ˜ν–‰ ν•  μˆ˜μžˆλŠ” 방법을 μ œκ³΅ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

ModuleA.d.ts λ₯Ό 내보내렀고 ν•  λ•Œ μ»΄νŒŒμΌλŸ¬λŠ” λͺ¨λ“ˆμ˜ λͺ¨μ–‘을 λ‚˜νƒ€λ‚΄λŠ” 객체 μœ ν˜• λ¦¬ν„°λŸ΄ (예 : { moduleB: { classA: *mumble?* } } )을 μž‘μ„±ν•΄μ•Όν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ classA 직접 μ°Έμ‘°ν•˜λŠ” 이름이 λ²”μœ„μ— μ—†μœΌλ―€λ‘œ "이름을 지정할 수 μ—†μŒ"μœ ν˜•μ΄λ©° 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

import of ClassA λ₯Ό ModuleA.ts 에 μΆ”κ°€ν•˜λ©΄ 였λ₯˜κ°€ μ‚¬λΌμ§‘λ‹ˆλ‹€.

μ•ˆλ…• Ryan-μ‘°μ–Έ RE μŠ€νƒ μ˜€λ²„ν”Œλ‘œμ™€ 쑰언에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€- ModuleA κ°€μ Έ 였기λ₯Ό μΆ”κ°€ν•˜λ©΄ μ˜ˆμƒλŒ€λ‘œ 컴파일이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

여기에 μ•½κ°„μ˜ μ»¨ν…μŠ€νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. 제 λͺ©ν‘œλŠ” μ‹€μ œλ‘œ μ™ΈλΆ€ λͺ¨λ“ˆμ— λŒ€ν•œ 선언을 μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. (아직 μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•˜λŠ” 뢀뢄이 μžˆμŠ΅λ‹ˆκΉŒ? # 5039?)이 κ°€μ Έ μ˜€κΈ°κ°€ μ™„μ „νžˆ ν•„μš”ν•  수 μžˆμ§€λ§Œ ModuleA μ—μ„œ moduleBκ°€ 이미 λ‚΄λ³΄λ‚΄λŠ” 기호λ₯Ό κ°€μ Έμ™€μ•Όν•˜λŠ” 것이 쑰금 μ΄μƒν•©λ‹ˆλ‹€. 결과적으둜 ModuleB 의 개체 내보내기에 μΆ”κ°€ ν•  λ•Œλ§ˆλ‹€ κ°€μ Έ 였기λ₯Ό ModuleA 직접 μΆ”κ°€ν•΄μ•Όν•©λ‹ˆλ‹€.

import {moduleB} from './moduleB';
import {ClassA} from './ClassA';

λ˜λŠ” ModuleB (두 κ³³ λͺ¨λ‘μ—μ„œ ClassA 에 λŒ€ν•œ 경둜 지정을 쀄이기 μœ„ν•΄) :

import {moduleB, ClassA} from './moduleB';

λ‚˜λŠ” TS μ»΄νŒŒμΌλŸ¬μ— λŒ€ν•΄ 거의 μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ μ œκ°€ λ§ν•˜λŠ” 것은 μ™„μ „νžˆ λΉ„ν˜„μ‹€μ  일 수 μžˆμ§€λ§Œ μ²˜μŒμ—λŠ” μ»΄νŒŒμΌλŸ¬κ°€ ModuleB κ°€ N 개의 κΈ°ν˜Έκ°€μžˆλŠ” 객체λ₯Ό 내보내고 μžˆλ‹€κ³  μΆ”λ‘  ν•  수 μžˆλ‹€κ³  생각 ν–ˆμœΌλ―€λ‘œ ModuleA ν•΄λ‹Ή κΈ°ν˜Έκ°€ ν•„μš”ν•©λ‹ˆκΉŒ? ModuleB λŒ€ν•œ κ°€μ Έ 였기 정보가 이미 μžˆμŠ΅λ‹ˆλ‹€. ModuleA μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λ˜λŠ” ClassA λŒ€ν•œ κ°€μ Έ μ˜€κΈ°κ°€ μ™„μ „νžˆ ModuleB 내뢀에 μžˆμœΌλ―€λ‘œ λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ ClassA λŒ€ν•œ μœ ν˜•μ„ μΆ”λ‘  ν•  μˆ˜μžˆλŠ” 방법이 μ—†μŠ΅λ‹ˆλ‹€ ModuleA ?

μ‹œκ°„μ„λ‚΄μ–΄ λ‹΅λ³€ ν•΄ μ£Όμ…”μ„œ λ‹€μ‹œ ν•œ 번 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. λ‚˜λŠ” μ§€κΈˆ λ‚΄ 문제λ₯Ό λΆ„λ₯˜ ν–ˆμœΌλ―€λ‘œ μœ„μ˜ λ‚΄μš©μ€ 주둜 ν˜ΈκΈ°μ‹¬μž…λ‹ˆλ‹€. μ„œλ‘λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

당신이 무슨 λ§μ„ν•˜λŠ”μ§€ μ •ν™•νžˆ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. 이 μ œμ•ˆμ—μ„œ ModuleA.d.ts 은 (λŠ”) μ–΄λ–»κ²Œ ν‘œμ‹œλ˜μ–΄μ•Όν•©λ‹ˆκΉŒ?

μ»΄νŒŒμΌλŸ¬λŠ” 선언을 내보낼 λ•Œ μ‚¬μš©μž μ½”λ“œμ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 쒅속성 (즉, import λ¬Έ)을 μΆ”κ°€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν‘œμ‹œλ˜λŠ” 였λ₯˜λŠ” μ»΄νŒŒμΌλŸ¬κ°€ λ‚΄ 보낸 선언에 λŒ€ν•œ μœ ν˜• 주석을 μž‘μ„±ν•˜λ €κ³ ν•˜μ§€λ§Œ ν•  수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. 이것은 두 가지 이유 쀑 ν•˜λ‚˜λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 이름에 μ•‘μ„ΈμŠ€ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 즉 ν˜„μž¬ λͺ¨λ“ˆμ—μ„œ κ°€μ Έ μ˜€μ§€ μ•Šμ•˜κ±°λ‚˜ μ›λž˜ 선언을 μˆ¨κΈ°λŠ” 선언이 μžˆμŠ΅λ‹ˆλ‹€.

두 경우 λͺ¨λ‘ ν•΄κ²° 방법은 λͺ…μ‹œ 적 μœ ν˜• 주석을 μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μœ ν˜• 주석을 μΆ”κ°€ν•˜λ©΄ 좜λ ₯μ—μ„œ β€‹β€‹κ·ΈλŒ€λ‘œ λ‚΄λ³΄λ‚΄μ§‘λ‹ˆλ‹€. λ‹€λ₯Έ μ˜΅μ…˜μ€ 이름에 μ•‘μ„ΈμŠ€ ν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 즉, λͺ¨λ“ˆμ— λŒ€ν•œ κ°€μ Έ μ˜€κΈ°κ°€ 있고 λͺ¨λ“ˆμ„ κ°€μ Έ μ˜€λŠ” μ‚¬μš©μžμ—κ²Œ 이것이 μ˜λ―Έν•˜λŠ” λ°”λ₯Ό μ΄ν•΄ν•©λ‹ˆλ‹€.

@mhegazyκ°€ λ§ν–ˆμŠ΅λ‹ˆλ‹€.

μ»΄νŒŒμΌλŸ¬λŠ” 선언을 내보낼 λ•Œ μ‚¬μš©μž μ½”λ“œμ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 쒅속성 (즉, import λ¬Έ)을 μΆ”κ°€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” μ½”λ“œμ— 항상 import 문이 ν•„μš”ν•˜μ§€λŠ” μ•ŠμœΌλ©° (λΆ„λͺ…νžˆ --declarations 없이 μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ—), 그것듀을 ν¬ν•¨ν•˜λ©΄ μ‹œλ„λŸ¬μ›Œμ„œ tslint 같은 것듀이 "λ―Έμ‚¬μš© μˆ˜μž…". μ»΄νŒŒμΌλŸ¬κ°€ λ‚΄ 보낸 μžλ°” μŠ€ν¬λ¦½νŠΈμ— 쒅속성을 μΆ”κ°€ν•˜λŠ” 것을 μ›ν•˜μ§€ μ•ŠλŠ” 이유λ₯Ό μ•Œ 수 μžˆμ§€λ§Œ 선언을 λ‚΄λ³΄λƒ„μœΌλ‘œμ¨ 쒅속성을 μΆ”κ°€ν•˜λŠ” 데 μ–΄λ–€ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

이 μ œμ•ˆμ„ μΆ”μ ν•˜λ €λ©΄ μ–Έμ œλ“ μ§€ 문제λ₯Ό κΈ°λ‘ν•˜μ‹­μ‹œμ˜€. 합리적인 것은 importsλŠ” μ’…μ†μ„±μ˜ 선언이며 μ»΄νŒŒμΌλŸ¬λŠ” μ‚¬μš©μžκ°€ μ§€μ‹œν•˜μ§€ μ•ŠλŠ” ν•œμ΄λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€.

이것은 더 κΉŠμ€ κ²°κ³Όλ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

moduleA -> moduleB -> moduleC -> moduleD .

moduleB 은이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ import { ABC } from 'moduleA' λ₯Ό μˆ˜ν–‰ν•΄μ•Όν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

moduleC moduleB λ₯Ό μ‚¬μš©ν•˜κ³  μ„œλͺ…을 내보낼 λ•Œ moduleB ABC μ—μ„œ moduleA ν•˜μ§€λ§Œ μ΄λ²ˆμ—λŠ” ABC ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— λ‹€μ‹œ μ»΄νŒŒμΌμ— μ‹€νŒ¨ν•©λ‹ˆλ‹€ moduleB 보내지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ΄λŠ” λ‹€μŒ 쀑 ν•˜λ‚˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

  1. moduleC μš”κ΅¬μ˜ ν•˜λ“œ μ˜μ‘΄ν•΄μ•Όν•˜κΈ° moduleA κ°€μ Έμ˜¬ ABC
  2. moduleB λŠ” κ°€μ Έ 였기뿐만 μ•„λ‹ˆλΌ ABC λ‹€μ‹œ 내보내고 moduleC κ°€μ Έμ™€μ•Όν•©λ‹ˆλ‹€.

moduleD κ°€ λΉ„μŠ·ν•œ μΌμ„ν•œλ‹€λ©΄ 기본적으둜 전체 쒅속성 체인을 μ•Œμ•„μ•Όν•©λ‹ˆλ‹€.

λ‚˜λŠ” typings ν•˜κ³  있고 λ‚˜λ₯Ό λ§‰λŠ” λ¬Έμ œκ°€ 있기 λ•Œλ¬Έμ— 이것이 μ‚¬μ‹€μž„μ„ 증λͺ…ν•˜κΈ° μœ„ν•΄ 이것을 ν…ŒμŠ€νŠΈ ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€ : https://github.com/typings/typings/issues/625 ~~

νŽΈμ§‘ : λ‚˜λŠ” 그것을 μž¬ν˜„ ν•  수 있고 μ‹€μ œλ‘œ λ‚΄ moduleD λŠ” κ°€μ Έ 였기λ₯Ό μœ„ν•΄ moduleA λ₯Ό μ°Έμ‘°ν•΄μ•Όν•©λ‹ˆλ‹€.
λ‚΄ μ˜ˆμ—μ„œ :

  • moduleA => redux
  • moduleB => redux-thunk
  • moduleC => redux-thunk μœ„μ—μžˆλŠ” μ‚¬μš©μž 지정 μ½”λ“œ
  • moduleD => 일뢀 λ„μ„œκ΄€
  • ABC => redux Dispatch μΈν„°νŽ˜μ΄μŠ€

@unionalμ—μ„œ μ„€λͺ…ν•œ 것과 λ™μΌν•œ λ¬Έμ œκ°€

이 문제λ₯Ό λ‹€μ‹œμ—¬μ‹­μ‹œμ˜€. @unional 에 μ˜ν•΄ μ„€λͺ… 된 λ¬Έμ œλŠ” 맀우 ν˜„μ‹€μ μ΄λ―€λ‘œ λ‹€μ‹œ λ‚΄λ³΄λ‚΄λŠ” μ›λž˜ λͺ¨λ“ˆκ³Ό λ™μΌν•œ μœ ν˜•μ„ μ‚¬μš©ν•˜λ©΄μ„œ 라이브러리 μœ„μ— 쀑간 / λ„μš°λ―Έ 라이브러리λ₯Ό μΆ”κ°€ν•˜κΈ°κ°€ 맀우 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

https://github.com/Microsoft/TypeScript/issues/9944 νŠΈλž™μ„ λ°œν–‰ν•˜μ—¬ μ„ μ–Έ 방좜 λ‹¨κ³„μ—μ„œ κ°€μ Έ 였기λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

감사!

κ°€μ Έ 였기λ₯Ό μΆ”κ°€ ν•  λ•Œμ˜ λ¬Έμ œμ μ€ noUnusedLocals ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μœ ν˜•μ— λŒ€ν•΄ λΆˆν‰ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λͺ…μ‹œ 적 μœ ν˜• 주석을 μΆ”κ°€ ν•  수 μžˆμ§€λ§Œ 좔둠을 얻지 λͺ»ν•©λ‹ˆλ‹€. 예:

class Whatever {
  fetch(uri: string): Promise<void> { }
  ensureFetched = MemoizedFunction<(uri: string) => Promise<void>> = memoize((uri: string) => this.fetch(uri))
}

ensureFetched λŒ€ν•œ μœ ν˜• 주석을 μƒλž΅ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.
tsconfigμ—μ„œ : include: [ ..., "node_modules/@your_scope/your_library" ]
ν–‰μš΄μ„ λΉ•λ‹ˆλ‹€.

@ salim7 μ΄λ ‡κ²Œν•˜λ©΄ 컴파일 μ‹œκ°„μ΄ λŠλ €μ§€κ³  (이미 컴파일 된 라이브러리λ₯Ό λ‹€μ‹œ μ»΄νŒŒμΌν•˜κΈ° λ•Œλ¬Έμ—) λŒ€μƒ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν•¨κ»˜ 엄격 μ„± μ„€μ •μ˜ μ΅œμ†Œ 곡톡 λΆ„λͺ¨λ₯Ό μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.

@mhegazy λ¬Έμ œλŠ” λ‹€μŒ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μž¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

import * as Foo from "./Foo";

export class Bar {
    baz = new Foo.Baz(); // Compiler forgot "Foo." prefix in the type, and throws this error, because "Baz" without perfix is not imported.
    getBaz() { // All the same
       return new Foo.Baz();
    }
}

μ†”λ£¨μ…˜μ€ λͺ…μ‹œ 적 μœ ν˜•μ„ μ§€μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

import * as Foo from "./Foo";

export class Bar {
    baz: Foo.Baz = new Foo.Baz(); // ok
    getBaz(): Foo.Baz { // ok
       return new Foo.Baz();
    }
}

μœ„μ˜ μƒ˜ν”Œμ„ μ‚¬μš©ν•˜μ—¬ μž¬ν˜„ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μƒˆ 버그λ₯Ό μ‹ κ³ ν•˜κ³  문제λ₯Ό μž¬ν˜„ ν•  수 μžˆλ„λ‘ 더 λ§Žμ€ μ»¨ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•˜μ„Έμš”.

@PFight κ°μ‚¬ν•©λ‹ˆλ‹€! 그것은 λ‚˜λ₯Όμœ„ν•œ κ²ƒμ΄μ—ˆλ‹€!

λ‹€μŒμ„ μ‚¬μš©ν•  λ•Œ 방금이 λ¬Έμ œμ— μ§λ©΄ν–ˆμŠ΅λ‹ˆλ‹€.

export { IMyInterface } from './file'
````

The solution was to do this:
```ts
import { IMyInterface } from './file'
export { IMyInterface }

κ·ΈλŸ¬λ‚˜ 이것은 μ •λ§λ‘œ ν•„μš”ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€.

noUnusedLocals λ₯Ό λ‹€λ£¨λŠ” 방법을 μ•Œμ•„ λ‚Έ μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

@yordis // @ts-ignore

@ pelotom λ„€ 이것은 μ™„μ „νžˆ λ‚΄ 잘λͺ»μž…λ‹ˆλ‹€.

λ‚˜λŠ” ν•œ 가지λ₯Ό μƒκ°ν•˜κ³  λ‹€λ₯Έ 것을 μΌμŠ΅λ‹ˆλ‹€.

Typescriptκ°€ noUnusedLocals 와 μ„ μ–Έ μ‚¬μ΄μ˜ 문제λ₯Ό ν•΄κ²° ν–ˆμŠ΅λ‹ˆκΉŒ?

μ €μ—κ²Œ μ™„μ „νžˆ κ³ ν†΅μŠ€λŸ¬μ›Œμ§€λŠ” ν˜„μž¬μ˜ ν•΄κ²° 방법은

import {SomeInterface} from "./SomeFile";

const _dummySomeInterface : undefined|SomeInterface = undefined;
_dummySomeInterface;

//Code that implicitly uses SomeInterface

noUnusedLocals λ₯Ό ν”Όν•˜κ³  κ°€λŠ₯ν•œ 경우 μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ μœ ν˜• 좔둠도 ν—ˆμš©ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

DanielRosenwasser picture DanielRosenwasser  Β·  3μ½”λ©˜νŠΈ

weswigham picture weswigham  Β·  3μ½”λ©˜νŠΈ

blendsdk picture blendsdk  Β·  3μ½”λ©˜νŠΈ

kyasbal-1994 picture kyasbal-1994  Β·  3μ½”λ©˜νŠΈ

wmaurer picture wmaurer  Β·  3μ½”λ©˜νŠΈ