2017-09-30 1 views
1

library을 쓰고있어 타이프립트로 이식하려고합니다.속성이있는 함수를 선언하는 Typescript

const is = value => { 
    ... do some returns here 
} 

is.number = x => typeof x === 'number' 
is.bla = x => typeof x === 'bla' 

하는 index.js 등 :

현재는 그 같은 모양.

나는 is 및 모든 메소드를 설명하는 인터페이스를 작성했습니다.

type TypeQueryMethod = (val: any) => boolean; 

interface Is { 
    (val: any): string; 
    undefined: TypeQueryMethod; 
    null: TypeQueryMethod; 
    ... 
} 

나는 유형과 is을 표시 할 때 : const is: Is = value => ...

그것은 오류가 발생합니다 :

개체의 선언이 분할이기 때문에 의미가
Type '(value: any) => string' is not assignable to type 'Is'. 
Property 'undefined' is missing in type '(value: any) => string'. 

.

메소드와 메소드가 모두 같은 객체를 어떻게 구성합니까?

답변

1

기능과 속성을 동시에 구현할 수 없습니다. 먼저 함수를 정의하고 Is에 주장과 방법의 나머지 정의 할 수 있습니다 :

const is = ((val: any) => typeof (val)) as any as Is; 

is.null = (val) => true; 
is.undefined = (val) => true; 

또는 Is 만드는 공장 함수를 사용하면 유형 검사를 확인하려면

function createIs(): Is { 
    const is = ((val: any) => { 
     return ""; 
    }) as Is; 
    is.null = (val) => true; 
    is.undefined= (val) => true; 
    return is; 
} 

const is: Is = createIs(); 
+0

'Object.assign()'을 사용하여 형식 어설 션없이 'Is'를 생성 할 수 있어야합니다. – jcalz

0

을 행복, 당신은 단계를 구축하지 않고 완전히 형성 Is 개체를 반환 Object.assign()를 사용할 수 있습니다

const is: Is = Object.assign(
    (val: any) => typeof val, 
    { 
    undefined: (val: any) => typeof val === 'undefined', 
    null: (val: any) => (val === null) 
    // ... 
    } 
); 

물론 코드 구조를 변경하고 싶지 않다면 @Saravana가 제안한대로 type assertion을 사용하여 기술적으로는 같지 않지만 이 정확히 Is임을 유형 검사기에 알리면됩니다. 네가 그것을 완성 할 때까지 하나씩.

어느 쪽이든이 작동하지만, 당신이 뭔가 구현하는 데 게을리하는 경우 유형 검사는 경고 때문에 나는 Object.assign() 방법을 선호 :

// error, "undefined" is missing 
const is: Is = Object.assign(
    (val: any) => typeof val, 
    { 
    null: (val: any) => (val === null) 
    // ... 
    } 
); 

을하면서 형의 주장 방법은하지 않습니다 :

const is = ((val: any) => typeof val) as any as Is; 
is.null = (val) => val === null; 
// no error 

타입 선언 방법은 그렇지 않습니다. 그것은 당신에게 달려 있습니다. 희망은 도움이된다. 행운을 빕니다!

관련 문제