2017-12-27 7 views
1

사용자 지정 형식 정의를 사용하여 Express API 내에서 반환 형식을보다 구체적으로 지정하고 싶습니다. 우리는 응용 프로그램 내에 전역 객체를 유지하기 위해 app.setapp.get을 사용하고 있습니다.반환 형식을 더 구체화하기 위해 병합하는 Typescript 인터페이스

app.get('foo')은 특정 클래스 MyClass을 반환하므로 명시 적으로 캐스팅하지 않으려면 TypeScript를 사용하여이 사실을 표현하고 싶습니다. 내 사용자 정의 유형 정의에서

get: ((name: string) => any) & IRouterMatcher<this>; 

나는 다음과 같은 추가 : 다음과 같이

포함 index.d.tsapp.get에 대한 기존의 정의가 보이는

import { MyClass } from '../MyClass'; 

declare global { 
    namespace Express { 
    export interface Application { 
     get (name: 'foo'): MyClass; 
     // also tried this to conform to existing structure: 
     // get: ((name: 'foo') => MyClass); 
    } 
    } 
} 

그러나 두 경우의 반환 형식

app.get('foo')은 여전히 ​​ any입니다.

이 가능 암시 적으로 올바른 유형을 가지고가 일을 할 때는 ... 다음 :

let myObject = app.get('foo'); 
... 그리고 것을 방지하려면 쓰기 :

let myObject: MyClass = app.get('foo'); 

답변

1

글쎄, express.js type definitions I의 현재 버전 이 코드로 get 기능을 보강 할 수 있다고 생각했습니다.

custom.d.ts :

import { MyClass } from './MyClass'; 

declare module 'express-serve-static-core' { 
    export interface IRouterMatcher<T> { 
    (name: 'foo'): MyClass; 
    } 
} 

설명 : 당신은 관련이 없어 보이는 인터페이스 declaration merging를 사용하기 때문에

불행하게도이 조금 hackish 솔루션입니다. 당신은 당신이 this 대답처럼 글로벌 Express 공간의 확대를 사용할 수 없기 때문에이 작업을 수행 할 필요가 :

declare namespace Express { 
    export interface Application { 
    get(name: 'foo'): MyClass; //doesn't work :(
    } 
} 

당신이 typings에 더 가까이 볼 것이다 경우 때문에 Express.Application에서 getset 방법이있는 것을 볼 수 있습니다 extends 키워드를 사용하여을 재정의했습니다. 당신은 속성의 유형을 변경하는 경우 선언 병합이 작동하지 않기 때문에

export interface Application extends IRouter, Express.Application { 
    ... 
    set(setting: string, val: any): Application; 
    get: ((name: string) => any) & IRouterMatcher<this>; 
    ... 
} 

또한 당신은 getset 방법을 보강 할 수 없습니다.

declare module 'express-serve-static-core' { 
    export interface Application { 
    get: ((name: string) => any) & 
     IRouterMatcher<this> & 
     ((name: 'foo') => MyClass); 
     //Error: 'Error: Subsequent variable declarations must have the same type. :(
    } 
} 

더 깨끗한 해결책은 DefinitelyTyped typing을 변경하는 것입니다. Request 오브젝트의 기능 보강이 previously에 언급 된 질문 (get 서명이 사용자 정의 된 유형과 병합 할 수있는 인터페이스로 표시되어야 함)에서 수행되는 것과 유사하게 작동 할 수 있습니다.

+0

자세한 설명 및 제안에 대해 감사드립니다. 매우 도움이된다! – qqilihq

관련 문제