2016-08-10 5 views
0

다음 코드를 사용하십시오.TypeScript duck typing : 하나의 속성 만 필요합니다.

interface ParamTest extends Object { 
    ids?: any; 
    model?: any; 
    params?: any; 
    pageContext?: PageContext; 
} 

class Foo { 
    public callMeWithParamsPlease(params: ParamTest): void{ 

    } 

    public nope() { 
     this.callMeWithParamsPlease("hi"); 
    } 
} 

매개 변수로 제공 될 내용을 알지 못합니다. 그러나 나는 적어도 하나는 필드를 채워야한다는 것을 알고 있습니다. 내가 사용하는 경우 :

export interface ApiServiceOpts extends Object { 
    ids?: any; 
    model?: any; 
    params?: any; 
    pageContext: PageContext; 
} 

를 그 다음은 예상대로, 더 이상 문자열과 호환 없습니다 - 문자열이 pageContext이 없기 때문에. 그러나 나는 pageContext가 제공 될지 확실히 알지 못합니다. 그러나 적어도 하나의 필드를 제공해야한다는 것을 알고 있습니다. 이것을 허용하는 마법 타이프 스크립트 문법이 있습니까?

어쩌면 다음과 같습니다.

interface PageContext {} 


export interface ParamTestId { 
    ids: any; 
} 

export interface ParamTestModel { 
    model: any; 
} 

export interface ParamTestParams { 
    params: any; 
} 

export interface ParamTestPageContext { 
    pageContext: PageContext; 
} 

class Foo { 
    public callMeWithParamsPlease(params: ParamTestId & ParamTestModel & ParamTestParams & ParamTestPageContext): void { 
     params.ids.a = ""; 
     params.model.b = {} 
    } 

    public nope() { 
     this.callMeWithParamsPlease("hi") 
    } 
} 
+0

당신이 요구하는지 분명하지 않다. ''더 이상 문자열과 호환되지 않습니다. ''- 문자열과 호환되는 시점은 언제입니까?이 "it"입니까? 귀하의 코드에서 문자열 매개 변수가있는 곳은 없습니다. 또한, 왜'Object'를 확장하겠습니까? –

답변

0

나는 다음을 제안 :

  • 아무것도 추가하지 않습니다 Object 확장, 사용자 인터페이스는 이미 객체입니다. 그것을 제거하십시오. string는 또한 Object 때문에
  • 당신의 유형은 string 호환했지만 당신은에 의존하는 대신에, 즉

    callMe(params:ParamTest|string) { 
        // params may be a string now regardless of ParamTest's definition. 
    } 
    
  • 는 객체 나 문자열에 동의 함을 명시 적으로를 나타내는 유형의 조합을 사용하지 말아야합니다 당신은 당신이 실제로 PARAMS에 무엇을 가지고 확인하는 유형의 가드를 사용해야하는이 시점, 즉 :

    interface ParamTest { 
        ids:string[]; 
        paramContext:string; 
    } 
    class Foo { 
        callMeMaybe(params:ParamTest|string) { 
        if (params instanceof String) { 
         // Cool it's a string. 
         let x = params.charCodeAt(0); 
        } else { 
         let m = params.ids; 
        } 
        } 
    } 
    
+0

질문을 이해했는지 확신 할 수 없습니다. 'ParamTest'는'string' 타입과 호환됩니다. 함수가 명시 적으로'ParamTest'를 받아들이더라도 모든 속성이 선택 사항이기 때문에 문자열을 전달할 수 있습니다. – David