2017-12-12 4 views
1

은 다음 컴파일하지 않는 노동 조합의 형태로 하나의 가능성을 필터링 목록의 항목. 결과적으로 "Type '(number | null) []'이 'number []'유형에 할당 할 수 없습니다."

function g(n: number[]): number[] { 
    return n.map(f).filter(n => n).map(n => n!); 

}

하지만이 의미 루프를 통해 진행됩니다

다음은 작업을 수행합니다. 이것 역시 작동합니다

function g(a: number[]): number[] { 
    return a.map(f).filter(n => n) as number[]; 
} 

그러나 많은 종류의 죄를 가릴 것 같은 캐스트입니다. 다른 제안?

+0

'filter()'가 다른 타입의 배열을 반환하게하려면 인자로 타입 가드를 주어야합니다. https://github.com/Microsoft/TypeScript/issues/18562도 참조하십시오. – artem

답변

2

필터링 방법을 추출하고 유형 가드를 사용하여 좀 더 정확하게 만들 수 있습니다. 그래서 같이

:

function f(n: number): (number | null) { 
    return n > 0 ? n : null 
} 

function hasValue(n: number | null): n is number { 
    return !!n 
} 

function g(a: number[]): number[] { 
    return a.map(f).filter(hasValue) 
} 

참고. !! n은 0을 걸러 내기 때문에 정확하지는 않지만 타입 가드를 강조 표시하기에 적합