TypeScript의 Bookshelf Plugin 유형 정의

입문


TypeScript에서 Bookshelf Plugin의 유형을 정의하는 방법입니다.
나는 뭘 좀 써야 할 것 같아, Advent Calendar가 늦었어.

Bookshelf Plugin이란?


BookshelfNode입니다.js의 ORM 중 하나입니다. 그 플러그인은 Bookshelf 플러그인입니다.
요즘 TypeScript의 유행은 TypeORM...💦.
DAOModel의 경우 페이지 정렬 등의 기능을 확장할 수 있습니다.
다음 플러그인은 Bookshelf 자체에 내장되어 있으며, 필요에 따라 즉시 사용할 수 있으며, 추가 의존 관계가 없습니다.
  • Registry: 반복 참조를 피하기 위해 require 함수나 import 문장을 사용하지 않고 문자열에서 다른 Model 플러그인을 인용합니다.많은 관계를 가진 모델 등에 쓰인다.
  • 가상: 모델이 데이터베이스에 존재하지 않는 가상 열을 가질 수 있도록 하는 플러그인입니다.
  • Visibility: JSON이 서열화되었을 때 일부만 표시되고 일부는 표시되지 않는 플러그인입니다.
  • Pagination: ModelfetchPage 방법을 추가하여 LIMIT 또는 OFFSET 전체 열의 플러그인을 자동으로 지정합니다.이걸로 하고 싶어요.
  • Case Converter: DB의 열 이름이 snake_case 에서 camelCase 또는 그 반대의 플러그인으로 변환됩니다.몰드 정의가 필요하지 않습니다.
  • 프로세서: set 행동을 바꾸기 위해 연결할 수 있는 플러그인입니다.이걸로 뭐든지...💦💦💦.
  • Bookshelf Plugins

    플러그인 유형 정의


    Bookshelf 자체에는 유형 정의@types/bookshelf가 존재하지만 라이브러리에 내장된 플러그인은 이 유형 정의에 포함되지 않습니다.
    또한 라이브러리 밖Community Plugins은 당연히 스스로 유형 정의를 해야 한다.
    이번에는 페이지를 넘기는 플러그인pagination을 사용하고 싶어서 이 유형의 정의를 만들었다.
    참조는 API Reference 이 아니라 pagination.js 입니다.
    Bookshelf의 API 참조는 영어로 작성되었기 때문에 실제 구현도 이해했습니다.💦.
    index.d.ts
    import * as Bookshelf from 'bookshelf';
    import * as BlueBird from 'bluebird';
    
    declare module 'bookshelf' {
        interface Model<T extends Model<any>> {
            fetchPage(options?: FetchPageSizeOptions): BlueBird<PaginationCollection<T, SizePagination>>;
            fetchPage(options?: FetchPageLimitOptions): BlueBird<PaginationCollection<T, LimitPagination>>;
        }
    
        interface Collection<T extends Model<any>> {
            fetchPage(options?: CollectionFetchPageSizeOptions): BlueBird<PaginationCollection<T, SizePagination>>;
            fetchPage(options?: CollectionFetchPageLimitOptions): BlueBird<PaginationCollection<T, LimitPagination>>;
        }
    
        interface FetchPageSizeOptions extends FetchOptions {
            pageSize?: number;
            page?: number;
        }
    
        interface FetchPageLimitOptions extends FetchOptions {
            limit: number;
            offset: number;
        }
    
        interface CollectionFetchPageSizeOptions extends CollectionFetchOptions {
            pageSize?: number;
            page?: number;
        }
    
        interface CollectionFetchPageLimitOptions extends CollectionFetchOptions {
            limit: number;
            offset: number;
        }
    
        interface PaginationCollection<T extends Model<any>, U extends Pagination> extends Collection<T> {
            pagination: U;
        }
    
        interface Pagination {
            rowCount: number;
            pageCount: number;
        }
    
        interface SizePagination extends Pagination {
            page: number;
            pageSize: number;
        }
    
        interface LimitPagination extends Pagination {
            offset: number;
            limit: number;
        }
    }
    
    걱정되는 것은 class Model<T extends Model<any>> 다른 방법을 어떻게 정의하는가 하는 것이다. 그러나 같은 이름의 인터페이스로 정의하면 추가할 수 있다.
    공식 참고Using a class as an interface에 따르면
    Using a class as an interface
    As we said in the previous section, a class declaration creates two things: a type representing instances of the class and a constructor function. Because classes create types, you can use them in the same places you would be able to use interfaces.
    있다
    클래스를 인터페이스로 사용
    위에서 말한 바와 같이 클래스 성명 생성은 다음과 같은 두 가지 사물, 클래스의 실례와 구조 함수의 유형을 나타낸다.클래스를 통해 그것들의 유형을 생성할 수 있으며, 그것들은 일부 지역에서 인터페이스로 사용할 수 있다.
    하계.
    TypeScript에서 여러 인터페이스를 정의하면 하나의 인터페이스에 통합되기 때문에 클래스와 같은 인터페이스에 결과를 추가하는 방법으로 이번 상황을 처리하고 싶습니다.

    마지막


    TypeScript 자체의 책은 매우 적죠.
    엔지니어들이 영어를 미리 설치했는데 공식 참고를 봐야 하나...💦💦💦.
    천하의 아마존도 찾아보았는데, 언뜻 보기에 매우 좋은 것은
    TypeScript 실습 프로그램
    차이가 많지 않다.
    언어의 진화에 대해 출판 연도가 상당히 오래되었는데, async/await 아직 없을 때의 책을 여러분이 한 획 집필할 수 있겠습니까?
    이 글에 표시된 코드는 WTFPL v2로 책임을 질 수 없지만 자유롭게 사용할 수 있습니다.
    실제로 GitHub도 이상한 홍보와 함께 상승했다.
    Bookshelf Plugin의 유형 정의를 어떻게 높여야 할지 아시는 분께서...💦💦💦.

    좋은 웹페이지 즐겨찾기