์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Typescript์ ๋ํ "์ ํ ์ ์"๋ฅผ ์์ฒญํ๊ณ ์ถ์ต๋๋ค. ๋ด Typescript ํ๋ก์ ํธ์์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ์ฌ ํด์.
์ด๊ฒ์ด ์ ํํ ๋ฌด์์ธ์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ์ง๊ธ TypeScript ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ด๋ฉฐ ์ด ๋ณ๊ฒฝ ์ฌํญ์ด ์ผ๋ง๋ ํฐ๊ฐ์?
display/api.js์์ ์ ์ ํ์ผ์ ๋ค์ ์์ฑํ ์ ์์ผ๋ฉฐ ์ด๋ฏธ ํด๋ณธ ์ฌ๋์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html ์์ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค. ๋ฌธ์ ๋ api.js์ ์ ์ ํ์ผ์ ๋๊ธฐํ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ด์ง๋ง ํ์๊ฐ ์์ฑ๋๋ฉด ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค.
pdf.d.ts๋ src/ ํด๋์ ํ์ผ์ด ์๋๋ผ pdfjs-dist/build/pdf.js ํ์ผ์ ๋ํด ์์ฑ๋ฉ๋๋ค.
"์ ํ ์ ์ธ ํ์ผ"์ ๋ง๋ ๊ฒฝํ์ด ์๊ธฐ ๋๋ฌธ์ "์ ํ ์ ์ธ ํ์ผ"์ ๋ง๋๋ ๊ฒ์ด ์ผ๋ง๋ ๋ง์ ์์ ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Typescript์์ "์ ํ ์ ์ธ ํ์ผ" ์์ด ํ์ฌ Javascript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง, "์ ํ ์ ์ธ ํ์ผ"์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด์ ํ๋ถํ ์ธํ ๋ฆฌ์ผ์ค๋ฅผ ์ป์ ์ ์์ต๋๋ค.
https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html ์ "์ ํ ์ ์ธ ํ์ผ"์ ๋ํ ํ์ต์ โโ์์ํ๊ธฐ์ ์ข์ ๋ฆฌ์์ค์ ๋๋ค.
NPM์์ "์ ํ ์ ์ธ ํ์ผ"์ ์ฌ์ฉํ ์ ์๋๋ก ํ ์๋ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ํ๋ก์ ํธ์ ์ฝ๊ฒ ํฌํจํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ: npm install @types/pdfjs-dist --save-dev
"@types/"๋ฅผ ํตํด ๊ฒ์ํ๋ ๊ฒ์ด ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ํ์ฌ ๊ธฐ์ฌ์๊ฐ ๋ง๋ญ๋๋ค. .d.ts ํ์ผ์ ๋ํ ์ง์์ ํฌํจํ๊ธฐ๋ก ์ฝ์ํ ๊ฒฝ์ฐ pdfjs-dist์ package.json ๋งค๋ํ์คํธ์ ํฌํจ๋ ์ ์์ต๋๋ค(๋ณ๋์ npm ํจํค์ง afaik์ ๋ฐฐ์นํ ์ด์ ๊ฐ ์์)
์ถ์ : ์ฐจ์ด์ ์ https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html์ ์ฐธ์กฐํ์ญ์์ค.
๋ถ๋ช ํ ๊ธฐ์กด NPM ํจํค์ง์ ํจ๊ป "์ ํ ์ ์ธ ํ์ผ"์ ๋ฌถ์ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ํด ์์๋ค. @types/์ ๊ฒ์ํ ํ์๊ฐ ์์ต๋๋ค.
์ด์ ๋ํ d.ts ํ์ผ์ด ConfirmTyped ๋ฆฌํฌ์งํ ๋ฆฌ์ ์์ต๋๋ค.
์ผ๋ง๋ ์์ ํ๊ฑฐ๋ ์ ํํ์ง๋ ํ์ธํ์ง ์์์ง๋ง ์ข์ ์ถ๋ฐ์ ์ด ๋ ์ ์์ต๋๋ค.
ํ์คํ Typed์์ ํ์ดํ์ ์ฌ์ฉํด ๋ณด์์ง๋ง ๋๋ฌด ๋๋น ์ ์ฐ์ค๊ฝ์ค๋ฝ์ต๋๋ค. (์ธ์ง ์๋๋ก ์์ด)
๋ค์์ ์ต์ ์ ๋ ฅ์ ๋๋ค(์ด๋๋จ): https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/pdfjs-dist/index.d.ts
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// imports typings first
import { PDFJSStatic, PDFDocumentProxy, PDFPromise } from 'pdfjs-dist';
// then import the actual library using require() instead of import
let pdfjs: PDFJSStatic = require("pdfjs-dist");
// only then you can actually do something useful
pdfjs.getDocument('helloworld.pdf').then(function (pdf: PDFDocumentProxy ) {
let pageNum = 1;
renderPage(pdf, pageNum);
});
๊ฐ์์ PDFJSStatic
์ ํ์ ๊ฐ์ ธ์จ ๋ค์ require()
์ฌ์ฉํ์ฌ ํด๋น ์ ํ์ ๋ณ์๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๊น? ๊ทธ๊ฑด ์์ ํ ๋์ผ์ค์ผ. (์์์์๊ฒ ํผํด๋ฅผ ์ฃผ์ง ์์)
pdfjs์ ๋ํด ๋ ๋์ ํ์ง์ ํ์ดํ์ด ํ์ํ๋ฏ๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ฌ์ญ์์ค. ๋ค์ SO ์ง๋ฌธ ์ค ๋ช ๊ฐ์ง๋ฅผ ์ดํด๋ณด์ญ์์ค.
TypeScript ์ฑ์์ pdf.js๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๊ฒฐ๊ตญ ์ฐ๋ ๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ํฌ๊ธฐํ๊ณ ๋ค๋ฅธ ๊ฒ์ ์๋ํ๊ฒ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์คํ Typed์์ ์ด๋ค ์ข
๋ฅ์ ๋ฐํ๋ ์์ด ํ์ดํ์ด @types/pdf
์์ @types/pdfjs-dist
๋ก ์ฎ๊ฒจ์ง ๊ฒ์ ๋์์ด ๋์ง ์์ต๋๋ค.
๋ฐ๋ผ์ pdfjs-dist
ํจํค์ง์ ์์ฒด ํฌํจ๋ ๊ณ ํ์ง ํ์ดํ์ด ์๋ค๋ฉด ๋ชจ๋ ๊ณณ์ TypeScript ๊ฐ๋ฐ์์๊ฒ ํจ์ฌ ๋ ์ข์ ๊ฒ์
๋๋ค.
@StevenLiekens ๋ ์ ๋์ ์ผ๋ก ์ณ์ต๋๋ค. ์ ํ ์ ์ ํ์ผ @types/pdfjs-dist
์ TRAGEDY ์
๋๋ค. GlobalWorkerOptions
. Mozilla๊ฐ ์ด ํ๋ก์ ํธ์ ๋ํ ์ ํ ์ ์ ํ์ผ์ ์ ๊ณตํ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ์ด๋ ค์ด๊ฐ์? ์ฐ๋ฆฌ๋ Mozilla์์ ๋ ๋ง์ ๊ฒ์ ๊ธฐ๋ํฉ๋๋ค.
๋ถ๋ช์น๋ค. @types/pdfjs-dist
๋ ๊ฑฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@types/pdfjs-dist
๋ ํค๋งค๊ณ ์์ต๋๋ค. ํ
์คํธ ๋ ์ด์ด ๋ ๋๋ง์ด ์์ต๋๋ค. ์ ์ธ ๋ณํฉ์ ํตํด ๋ชจ๋์ ๋ณด๊ฐํ๋ ๋ฐฉ๋ฒ์ ์์กดํ์ต๋๋ค.
declare module "pdfjs-dist" {
export interface TextLayerRenderTask extends PDFLoadingTask<void> { }
export interface RenderTextLayerOptions {
textContent: TextContent;
viewport: PDFPageViewport;
container: HTMLElement;
}
export function renderTextLayer(options: RenderTextLayerOptions): TextLayerRenderTask;
}
@SandyGifford ์... pdf.js ์ ํ ์คํฌ๋ฆฝํธ ์ ํ์ ๋งค์ฐ ์ค๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
PR์ ๋ณด๋ด๋ฉด ๊ณต์์ ์ผ๋ก ์ง์๋ฐ์ ์ ์์ต๋๊น? API๋ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ต๋๋ค.
์ด๊ฑด ์ ๋ง ์ ๋ง ์ ๋ง ํ์ํฉ๋๋ค. pdf.js๋ ํ๋ฅญํ๊ณ ๊ธฐ๋ฅ์ ์ด์ง๋ง API๋ ๋ณธ์ง์ ์ผ๋ก ๋ฌธ์ํ๋์ด ์์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ ๋ง๋ก ์์ ๋์ด์ผ ํฉ๋๋ค.
+1, ์ ์ ํ ์ ํ ์ ์๊ฐ ํ์ํฉ๋๋ค!
์ปค๋ฎค๋ํฐ์ ๊ด์ฌ์ ๋ ์ฝ๊ฒ ์ธก์ ํ ์ ์๋๋ก ๋ต๊ธ ๋์ ์์ ๋๊ธ์ +1ํ์ธ์. ๋ํ ์ด๋ฅผ ์ํ ์์ ์ด ์งํ ์ค์ ๋๋ค. ๋ ๋์ ๋ฌธ์ํ ๋ฐ TypeScript ์ ์ ์์ฑ์ ์ํด JSDoc ์ฃผ์์ ๊ฐ์ ํ๋ ค๋ฉด ์ดํ ์ ์ ๋์ฐฉํ #11235์ 6์ผ ์ ์ ๋์ฐฉํ #11209๋ฅผ ์ฐธ์กฐํ์ธ์.
๋๊ตฐ๊ฐ๊ฐ ์ง๊ธ ์ ํ ์ ์ธ ํ์ผ์ ์์ฑํ๊ณ ์์ต๋๊น?
๋์ด์ค๊ธฐ ์์ฒญ #12102์ ์ํด ์์ ๋์์ต๋๋ค. ์ ์ง ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ณ ํ
์คํธ๊ฐ ์๋ฃ๋ ์๋ฃจ์
์ผ๋ก ์๋ ดํ๋ ๋ฐ ๊ฝค ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ง๋ง ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์์ ๋
ธ๋ ฅ ๋๋ถ์ ์ด์ ์๋ฃ๋์์ต๋๋ค. ํฅํ pdfjs-dist
๋ฆด๋ฆฌ์ค๋ JSDoc ์ฃผ์์์ ์์ฑ๋ TypeScript ์ ์๋ฅผ ์ ๊ณตํ๊ธฐ ์์ํ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋ ๋ ๋์ API ๋ฌธ์๋ฟ๋ง ์๋๋ผ ํ์ผ์ JSDoc ์ฃผ์์์ ์์ฑ๋ ๋ ๋์ ์ ํ์ ์ํด API ๋ฌธ์๋ฅผ ๋์ฑ ๊ฐ์ ํ๊ธฐ ์ํด ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ์คํ Typed์์ ํ์ดํ์ ์ฌ์ฉํด ๋ณด์์ง๋ง ๋๋ฌด ๋๋น ์ ์ฐ์ค๊ฝ์ค๋ฝ์ต๋๋ค. (์ธ์ง ์๋๋ก ์์ด)
๋ค์์ ์ต์ ์ ๋ ฅ์ ๋๋ค(์ด๋๋จ): https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/pdfjs-dist/index.d.ts
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์์
PDFJSStatic
์ ํ์ ๊ฐ์ ธ์จ ๋ค์require()
์ฌ์ฉํ์ฌ ํด๋น ์ ํ์ ๋ณ์๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๊น? ๊ทธ๊ฑด ์์ ํ ๋์ผ์ค์ผ. (์์์์๊ฒ ํผํด๋ฅผ ์ฃผ์ง ์์)pdfjs์ ๋ํด ๋ ๋์ ํ์ง์ ํ์ดํ์ด ํ์ํ๋ฏ๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ฌ์ญ์์ค. ๋ค์ SO ์ง๋ฌธ ์ค ๋ช ๊ฐ์ง๋ฅผ ์ดํด๋ณด์ญ์์ค.
TypeScript ์ฑ์์ pdf.js๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๊ฒฐ๊ตญ ์ฐ๋ ๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ํฌ๊ธฐํ๊ณ ๋ค๋ฅธ ๊ฒ์ ์๋ํ๊ฒ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์คํ Typed์์ ์ด๋ค ์ข ๋ฅ์ ๋ฐํ๋ ์์ด ํ์ดํ์ด
@types/pdf
์์@types/pdfjs-dist
๋ก ์ฎ๊ฒจ์ง ๊ฒ์ ๋์์ด ๋์ง ์์ต๋๋ค.๋ฐ๋ผ์
pdfjs-dist
ํจํค์ง์ ์์ฒด ํฌํจ๋ ๊ณ ํ์ง ํ์ดํ์ด ์๋ค๋ฉด ๋ชจ๋ ๊ณณ์ TypeScript ๊ฐ๋ฐ์์๊ฒ ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค.