2017-11-01 2 views
1

이 코드는 typescript 2.3에서는 제대로 작동하지만 typescript 2.4에서는 실패합니다. 이유를 설명해 주시겠습니까?typescript 이후로 사용자 정의 유형 가드가 변경된 이유 2.4

testFindTypeGuard.ts :

let el: Element; 

const nodes: Node[] = []; 

const result = nodes.find((n): n is HTMLFontElement => n.nodeName === "FONT"); 

el = result; 

my.d.ts :

interface Array<T> { 
    find<U extends T>(predicate: (value: T, index: number, obj: Array<T>) => value is U): U | undefined; 
} 

오류 메시지 : 귀하의 예제를 작동하게하기 위해

error TS2322: Build:Type 'Node' is not assignable to type 'Element'.

+0

'HTMLFontElement'에서'Node'로'find'의 유추 된 리턴 타입을 변경 한 커밋은 다음과 같습니다 : [일반 문맥 서명을 사용하는 람다에 대한 일반적인 유형을 추론합니다] (https://github.com/Microsoft/TypeScript/commit/872e916019a1a6cd33e03c1837569d4845c54576) (2.4.1에서 릴리스 됨). 유형 가드의 추측에 대한 영향이 의도적인지 아닌지는 잘 모르겠다. 문제를 게시하는 것이 좋습니다. – artem

+1

이 문제는 알려진 문제이며 [2.7 (https://github.com/Microsoft/TypeScript/pull/17600)에서 수정 될 가능성이 있음)입니다. 그 동안이 코드를 컴파일하려면 Fenton의 답변에서 제안한 바와 같이 명시 적 형식 매개 변수를 추가해야합니다.'nodes.find ((n) : n은 HTMLFontElement => ...)' – artem

답변

0

당신이, 당신을 예상대로 컴파일러에 U을 설명해야합니다. 타입 가드의 적용 가능성을 자동으로 넓히는 개념적 도약을하지 않습니다.

if-statement의 일부로 유형 가드를 사용하면 유형을 (if 및 else 모두에서) 변경합니다. 그러나 귀하의 예제에서, 당신은 당신이 원하는 곳으로 얻을 수있는 형식 인수 전달해야 컴파일러 것들을 쌓아하지 않을 때를 결정하기에 충분히 스마트입니다

const result = nodes.find<HTMLFontElement>((n): n is HTMLFontElement => n.nodeName === "FONT"); 

을, 다음은 당신에게 줄 것이다 오류가 : 컴파일러는 이전 버전에이의 더 나은 일을했다 생각한다면

const result = nodes.find<HTMLDivElement>((n): n is HTMLFontElement => n.nodeName === "FONT"); 

, 당신은 ... GitHub의에 문제를 제기 할 수 있습니다 당신 may have done so already 있지만.

관련 문제