2015-01-02 2 views
4
interface IMessage { 
    value: string; 
    length?: string; // <-- why is this line necessary? 
} 

function saySize(message: IMessage|IMessage[]) { 
    if (message instanceof Array) { 
    return message.length; 
    } 
} 

이 스 니펫은 컴파일되지만, lengthIMessage에 필요합니다. 이 알아두면 오류 : 나는 IMessage가 배열 유형으로 사용할 수 있다는 가정을 할 필요가 있기 때문에 TypeScript 공용 형식은 길이가 필요합니다.

unions.ts(8,24): error TS2339: Property 'length' does not exist on type 'IMessage | IMessage[]'. 

내가이 어긋을 찾을 수 있습니다. 선택 길이를 실제로 추가해야합니까, 아니면 실수입니까?

+2

에가 있어야 다음, 길이 속성은 필요하지 않아야 . Type Guard 패턴을 사용하면 (예와 약간 다름), if 문 내에서 유형을 유추해야합니다. 자세한 내용은 다음을 참조하십시오. http://blogs.msdn.com/b/typescript/archive/2014/11/18/what-s-new-in-the-typescript-type-system.aspx –

+0

True. saySize의 서명을'message : IMessage []'로 변경할 때'length'가 필요 없습니다. 하지만 IMessage와 IMessage []에 saySize를 사용할 수 없다. – donnut

답변

2

TypeGuard 용 TypeScript 1.4에 대해 현재 공개 된 문제는 없습니다. 타입 가드는 typeofinstanceof을 모두 포함합니다.

사용중인 검사 (instanceof)는 if 블록 내에서 유형이 좁혀 야합니다. 즉, 인터페이스에 length?: string;이 필요하지 않습니다.

문제를 해결할 수 있는지 또는 배열을 다르게 취급해야하는 특별한 이유가 있는지 알아 보려면 문제를 제기 할 수 있습니다. 한편

https://github.com/Microsoft/TypeScript/milestones/TypeScript%201.4

, 당신은 (AN iMessage를 그 속성을하지 않았을로) 당신의 인터페이스에 속성을 추가 피하기 위해이 추한 찾고 타입의 주장을 사용할 수 있습니다.

return (<IMessage[]><any>message).length;