Typescript: μœ ν˜• 검사기가 for-ofμ—μ„œ μœ ν˜•μ„ μžƒμŠ΅λ‹ˆλ‹€.

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

TypeScript 버전 : 2.0.8

μ•”ν˜Έ

// test.ts
interface Type {
  type: number;
}

interface TypeExt extends Type {
  arr: Type[];
}

const guard = (arg: Type): arg is TypeExt => arg.type === 1;
const otherFunc = (arg1: Type, arg2: TypeExt): void => {};

export function y(arg: Type): void {
  if (guard(arg)) {
    for (const ITEM/* error is here */ of arg.arr) {
      if (otherFunc(ITEM, arg)) {
      }
    }
  }
}

cmd둜 컴파일 됨 : tsc --noImplicitAny test.ts

μ˜ˆμƒλ˜λŠ” λ™μž‘ :
였λ₯˜ μ—†μŒ

μ‹€μ œ 행동 :

test.ts(14,16): error TS7022: 'ITEM' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
Bug Fixed

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

이것은 μ œμ–΄ 흐름 뢄석 λ¬Έμ œμž…λ‹ˆλ‹€. λŒ€ν•œ μœ ν˜• μΆ”λ‘ ν•˜κΈ° μœ„ν•΄ ITEM 우리의 μ œμ–΄ 흐름 μœ ν˜• μ•Œμ•„ λ‚΄μ•Ό arg.arr . 즉, arg μœ ν˜•μ— 영ν–₯을 λ―ΈμΉ˜λŠ” ꡬ성을 μ‚΄νŽ΄ λ΄μ•Όν•©λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” otherFunc λŒ€ν•œ 호좜이 ν¬ν•¨λ©λ‹ˆλ‹€.이 ν˜ΈμΆœμ€ μ‚¬μš©μž μ •μ˜ μœ ν˜• μˆ μ–΄ 일 수 μžˆμŠ΅λ‹ˆλ‹€. 그것이 μœ ν˜• μˆ μ–΄μΈμ§€ ν™•μΈν•˜κΈ° μœ„ν•΄, μš°λ¦¬λŠ” ITEM μœ ν˜•μ„ μ•Œμ•„μ•Όν•˜λŠ” 인자 ν‘œν˜„μ‹μ„ ν•΄κ²°ν•˜λŠ” 호좜 ν‘œν˜„μ‹μ„ ν•΄κ²°ν•©λ‹ˆλ‹€. 이둜 인해 ν•΄κ²°ν•  μˆ˜μ—†λŠ” μˆœν™˜ 성이 μƒμ„±λ˜λ―€λ‘œ μ•”μ‹œ 적 any μœ ν˜•μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

μœ ν˜• μˆ μ–΄ 인식 논리가 λ¨Όμ € ν•¨μˆ˜ 객체의 μœ ν˜•μ„ ν™•μΈν•˜κ³  λͺ¨λ“  호좜 μ„œλͺ…을 κ²€μ‚¬ν•˜λ„λ‘ν•˜μ—¬μ΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ •μ˜ μœ ν˜• μˆ μ–΄κ°€μ—†λŠ” 경우 호좜 인수 ν‘œν˜„μ‹μ„ ν•΄κ²°ν•˜μ§€ μ•Šκ³  쑰기에 ꡬ제 ν•  수 μžˆμœΌλ―€λ‘œ μˆœν™˜ 성을 ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•œνŽΈ, otherFunc ν˜ΈμΆœμ—μ„œ arg 에 κ΄„ν˜Έλ₯Ό μΆ”κ°€ν•˜κΈ° λ§Œν•˜λ©΄ μˆœν™˜ 성을 κΉ° 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, ν˜ΈμΆœμ„ otherFunc(ITEM, (arg)) ν•©λ‹ˆλ‹€. 이둜 인해 μ œμ–΄ 흐름 λΆ„μ„κΈ°λŠ” 더 이상 ν˜ΈμΆœμ„ κ°€λŠ₯ν•œ μ‚¬μš©μž μ •μ˜ μœ ν˜• μˆ μ–΄ 호좜둜 κ°„μ£Όν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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

이것은 μ œμ–΄ 흐름 뢄석 λ¬Έμ œμž…λ‹ˆλ‹€. λŒ€ν•œ μœ ν˜• μΆ”λ‘ ν•˜κΈ° μœ„ν•΄ ITEM 우리의 μ œμ–΄ 흐름 μœ ν˜• μ•Œμ•„ λ‚΄μ•Ό arg.arr . 즉, arg μœ ν˜•μ— 영ν–₯을 λ―ΈμΉ˜λŠ” ꡬ성을 μ‚΄νŽ΄ λ΄μ•Όν•©λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” otherFunc λŒ€ν•œ 호좜이 ν¬ν•¨λ©λ‹ˆλ‹€.이 ν˜ΈμΆœμ€ μ‚¬μš©μž μ •μ˜ μœ ν˜• μˆ μ–΄ 일 수 μžˆμŠ΅λ‹ˆλ‹€. 그것이 μœ ν˜• μˆ μ–΄μΈμ§€ ν™•μΈν•˜κΈ° μœ„ν•΄, μš°λ¦¬λŠ” ITEM μœ ν˜•μ„ μ•Œμ•„μ•Όν•˜λŠ” 인자 ν‘œν˜„μ‹μ„ ν•΄κ²°ν•˜λŠ” 호좜 ν‘œν˜„μ‹μ„ ν•΄κ²°ν•©λ‹ˆλ‹€. 이둜 인해 ν•΄κ²°ν•  μˆ˜μ—†λŠ” μˆœν™˜ 성이 μƒμ„±λ˜λ―€λ‘œ μ•”μ‹œ 적 any μœ ν˜•μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

μœ ν˜• μˆ μ–΄ 인식 논리가 λ¨Όμ € ν•¨μˆ˜ 객체의 μœ ν˜•μ„ ν™•μΈν•˜κ³  λͺ¨λ“  호좜 μ„œλͺ…을 κ²€μ‚¬ν•˜λ„λ‘ν•˜μ—¬μ΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ •μ˜ μœ ν˜• μˆ μ–΄κ°€μ—†λŠ” 경우 호좜 인수 ν‘œν˜„μ‹μ„ ν•΄κ²°ν•˜μ§€ μ•Šκ³  쑰기에 ꡬ제 ν•  수 μžˆμœΌλ―€λ‘œ μˆœν™˜ 성을 ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•œνŽΈ, otherFunc ν˜ΈμΆœμ—μ„œ arg 에 κ΄„ν˜Έλ₯Ό μΆ”κ°€ν•˜κΈ° λ§Œν•˜λ©΄ μˆœν™˜ 성을 κΉ° 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, ν˜ΈμΆœμ„ otherFunc(ITEM, (arg)) ν•©λ‹ˆλ‹€. 이둜 인해 μ œμ–΄ 흐름 λΆ„μ„κΈ°λŠ” 더 이상 ν˜ΈμΆœμ„ κ°€λŠ₯ν•œ μ‚¬μš©μž μ •μ˜ μœ ν˜• μˆ μ–΄ 호좜둜 κ°„μ£Όν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν—‰ν—‰
κ΄„ν˜Έ ν•΄κ²° 방법에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.
λ‚˜λŠ” 이것을 μ•Œμ•„ λ‚΄κ³  μ‹Άλ‹€. PR은 ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

@arusakov λ§ˆμŠ€ν„°μ—μ„œ μˆ˜μ •ν•˜μ„Έμš”!

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