2016-07-14 1 views
1

의 나는 다음과 같은 코드가 있다고 가정 해 봅시다 :타이프 라이터 strictNullChecks 및 폐쇄

function f(x: string | undefined) { 
    if (x) { 
     console.log(x); 
     Promise.resolve() 
      .then(() => g(x)) // error, x is string | undefined 
    } 

    // x = undefined; 
} 

function g(y: string) { 
} 

유형 가드 같은 if (x) 행위, 그래서 xconsole.log에서 string을 입력합니다. 그러나 .then의 폐쇄에서 참조 할 때 유형은 string | undefined입니다. .then의 코드가 실행되기 전에 값이 유형 가드 외부의 정의되지 않은 값으로 다시 변경 될 수 있기 때문에이 값이 있어야합니다. 하지만 다시 설정하지 않으면 Typescript가이를 감지 할 수있는 종류의 분석을 수행하면 안됩니다.

x! 연산자를 사용하여 해결할 수 있습니다. 그러나 저는 코드베이스에서 이런 종류의 일을 자주하고, x를 정의하지 않음으로써 나중에 깨지는 것을 막을 수는 없다는 것을 알았습니다.

다른 방법이 있습니까? 문제를 올바르게 이해하고 있습니까?

답변

3

난 당신이 중 하나를 수행 할 수 있다고 생각 :

(1) 사용 CONST :

function f(x: string | undefined) { 
    if (x) { 
     const x2 = x; 
     Promise.resolve().then(() => g(x2)); 
    } else { 
     // x = undefined; 
    } 
} 

(2) 약속하기 전에 g() 전화 :

function f(x: string | undefined) { 
    if (x) { 
     let y = g(x); 
     Promise.resolve().then(() => y); 
    } else { 
     // x = undefined; 
    } 
} 
+0

1 - 좋은 사실, 당신이 const 레퍼런스를 가지고있는 것이 아니라,'string' 만 입력하는 새로운 레퍼런스를 가지고 있다는 것입니다. 그래서'let'과'var'도 작동합니다. 그래도 혼란 스러울 것입니다. 2 - 사실,하지만 생각하는 시나리오에서는 그렇게 할 수 없습니다. 그렇지 않으면 나는 이미 :) –

+0

그래, 당신은 const 부분에 대해 맞아, 나는 함수의 param에 넣으려고하기 시작했다. 그러나 그것은 허용되지 않는다. 그래서 그것을 var로 바꾸지 않고 함수의 몸체에 복사했다. /방해. –