2017-11-21 38 views
0

타이프 라이터 definitelyTyped 정의 파일을 확장 :나는 다음과 같은 오류를 받고 있어요

src/models/priceAdjustment.ts(55,2): error TS2345: Argument of type '{ as: string; foreignKey: string; gql: any; }' is not assignable to parameter of type 'AssociationOptionsHasMany'. Object literal may only specify known properties, and 'gql' does not exist in type 'AssociationOptionsHasMany'.

오류는, 내가 존재하지 않는 "GQL"키를 (내가 그것을 연결하고있어 지정하기 위해 노력하고있어 분명하다 그래서 나중에 다른 곳에서 내 코드에 액세스 할 수 있습니다.)

내가 무엇을하고 싶은지 model.hasMany interface here을 확장하고 내 자신의 키를 추가하십시오. 이것이 가능한가? 그렇다면 어떻게해야합니까?

현재 해결 방법은 객체를 전달하기 전에 <any>으로 캐스팅하는 것입니다.이 방법은 더러운 해결 방법 인 것 같습니다.

나는 다음과 같은 시도 :

import Sequelize from 'sequelize'; 

export declare module Sequelize { 
    export interface MyAssociationOptionsHasMany extends Sequelize.AssociationOptionsHasMany { 
     gql?: any 
    } 
    export interface MyAssociations extends Sequelize.Associations { 
     hasMany(target: Sequelize.Model<any, any>, options?: MyAssociationOptionsHasMany): void; 
    } 
} 

을 그리고 지금은 다음과 같은 오류 얻을 :

TypeError: Cannot read property '239' of undefined 
    at getDeclarationSpaces (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:33121:54) 
    at checkExportsOnMergedDeclarations (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:33067:41) 
    at checkModuleDeclaration (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35036:17) 
    at checkSourceElement (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35505:28) 
    at Object.forEach (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:275:30) 
    at checkSourceFileWorker (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35566:20) 
    at checkSourceFile (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35551:13) 
    at getDiagnosticsWorker (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35604:17) 
    at Object.getDiagnostics (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35593:24) 
    at C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:56188:85 
+0

https://github.com/DefinitelyTyped/DefinitelyTyped#how-can-i-contribute –

+0

@ Mörre 이것은 내 응용 프로그램 용으로 특별히 만든 속성이므로 후속 작업과 관련이 없습니다 (내 응용 프로그램 이외), 변경 사항을 저장소에 적용하는 것은 잘못입니다. – FrankerZ

+0

Typescript는 [선언 병합] (https://www.typescriptlang.org/docs/handbook/declaration-merging.html)을 수행하므로 인터페이스에 추가하여 사용자 정의 파일을 만들 수 있어야합니다. –

답변

1

당신은 Declaration Merging를 통해이 작업을 수행 할 수 있습니다. 이 방법이 작동하는 가장 좋은 방법은 라이브러리를 "확장"파일로 가져 와서 거기에서 라이브러리를 확장하는 것입니다. 예를 들어,

extensions/library-name.extension.ts : 위 예에서

import AssociationOptionsHasMany from '/path/to/definition'; 
import 'library-name'; 

declare module 'library-name' { 
    interface InterfaceToExtend { 
    hasMany(options: AssociationOptionsHasMany): ReturnType; 
    } 
} 

, 우리는 library-name 모듈에서 생성 된 인터페이스를 확장 할. 우리가 수입을 사용하기 때문에, TypeScript는 파일을위한 모듈을 자동으로 생성하기 때문에이 파일을 위해 생성 된 모듈이 아니라 library-name 모듈에 인터페이스를 확장 할 것을 TypeScript에 알려야합니다. 이를 위해 우리가 가져온 라이브러리와 동일한 이름을 사용하는 모듈 declare 만 남았습니다.

모듈을 인터페이스로 확장해야한다고 말한 후에 확장해야하는 인터페이스와 같은 이름의 인터페이스를 정의하고 필요한 것을 추가하여 선언 합치기를 사용합니다. 이 경우, 이는 전달하고자하는 특정 유형을 인수로 취하는 새로운 메소드입니다.

확장자가 먼저로드되도록 tsconfig.json 파일을 업데이트해야했습니다. 당신이 라임을 사용하는 경우

{ 
    /* Blah, settings, blah */ 
    includes: ['./app/extensions/*.ts', './app/**/*.ts'], 
    /* Blah, settings, blah */ 
} 

, 여전히 불평 수도 있지만, 실제로 코드를 컴파일 또는 숭고한에서 종료 및 재개는 것 : 당신은 응용 프로그램의 나머지 전에 extensions 디렉토리를 포함하여 그렇게 할 수 있습니다 잘 작동합니다.

경고 단어. 선언 병합은 강력하지만 예기치 않은 동작이 발생할 수 있습니다. 일반적으로 여러분 (또는 다른 누군가)이 다른 곳에 정의한 구성 요소를 확장하는 것을 피하십시오. 이러한 구성 요소를 잘못 사용하고 있거나 리팩토링해야 할 필요가있는 경우 TypeScript의 이점은 엄격한 입력이라는 점입니다.

+0

발생하는 다른 문제로 내 질문을 업데이트했습니다. – FrankerZ

+0

@FrankerZ 'export interface MyAssociationOptionsHasMany extends Sequelize.MyAssociationOptionsHasMany {/ * ... * /}'대신'export interface MyAssociationOptionsHasMany {/*...*/'}와'MyAssociations'와 비슷한 것을 사용해보십시오. 나는 Sequelize에 너무 익숙하지 않아 Sequelize에 대해 너무 많은 설명을 할 수는 없다. – c1moore