{"componentChunkName":"component---src-templates-blog-post-js","path":"/TypeScript/@types_typeRoots_and_types/","result":{"data":{"site":{"siteMetadata":{"title":"JULog","author":"[Ju Chan Hwang]","siteUrl":"https://julog.netlify.app","comment":{"disqusShortName":"","utterances":"JuChanHwang/gatsby-starter-bee"},"sponsor":{"buyMeACoffeeId":"jbee"}}},"markdownRemark":{"id":"9fdfe7b2-a976-59ba-91cc-08faf35e07b7","excerpt":"타입스크립트 공식문서에 compilerOptions들로 typeRoots와 types를 아래와같이 정의한다. If  is specified, only packages under  will be included.  If  is specified, only packages listed will be included. types에 선언된 패키지들을 typeRoots에 선언된 패키지 하위에서만 탐색할 것이라는 의미이다.  예를들어, node, core…","html":"<p>타입스크립트 공식문서에 compilerOptions들로 <strong>typeRoots</strong>와 <strong>types</strong>를 아래와같이 정의한다.</p>\n<blockquote>\n<p>If <code class=\"language-text\">typeRoots</code> is specified, <em>only</em> packages under <code class=\"language-text\">typeRoots</code> will be included.</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n   <span class=\"token property\">\"compilerOptions\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n\t   <span class=\"token property\">\"typeRoots\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n       <span class=\"token string\">\"../../node_modules/@types\"</span><span class=\"token punctuation\">,</span>\n       <span class=\"token string\">\"../../typings\"</span>\n     <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n   <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<br>\n<blockquote>\n<p> If <code class=\"language-text\">types</code> is specified, only packages listed will be included.</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n   <span class=\"token property\">\"compilerOptions\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n       <span class=\"token property\">\"types\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"node\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"core\"</span><span class=\"token punctuation\">]</span>\n   <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><strong>types에 선언된 패키지들을 typeRoots에 선언된 패키지 하위에서만 탐색할 것이라는 의미이다.</strong> </p>\n<p>예를들어, node, core 패키지들의 인터페이스를 <code class=\"language-text\">node_modules/@types</code>의 하위 폴더, 또 <code class=\"language-text\">/typings</code>의 하위 폴더에서만 탐색 하겠다는 것이다. @types하위 폴더에 존재하지 않으면 typings의 하위 폴더를 탐색한다. 더 구체적인 예시를 살펴보자.</p>\n<br>\n<br>\n<p>기존 방식은 <code class=\"language-text\">project>core>types</code> 경로에서 필요한 타입을 컴포넌트에 import하는 방식이었다.</p>\n<blockquote>\n<p>index.ts</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">StringKeyDict<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">[</span>key<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<br>\n<blockquote>\n<p>StringKeyDict 인터페이스를 사용하는 컴포넌트</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> StringKeyDict <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../../../../../types/src/typings'</span><span class=\"token punctuation\">;</span>\n\nselectedCategories<span class=\"token operator\">:</span> StringKeyDict <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<br>\n<br>\n<p>하지만 우리는 tsconfig compilerOptions의 types에 ‘core’패키지를 명시했다. </p>\n<blockquote>\n<p>tsconfig.app.json</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n   <span class=\"token property\">\"compilerOptions\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n\t   <span class=\"token property\">\"typeRoots\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n       <span class=\"token string\">\"../../node_modules/@types\"</span><span class=\"token punctuation\">,</span>\n       <span class=\"token string\">\"../../typings\"</span>\n     <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"types\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>'core'<span class=\"token punctuation\">]</span>\n   <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>즉, core에 선언된 인터페이스를 탐색하겠다는 의미이다. 그리고, 모든 폴더를 탐색하는 것이 아닌, typeRoots에 명시된 패키지들을 순차적으로(node_modules/@types => /typings)탐색 하며 타입을 찾을 것이다.</p>\n<p> <code class=\"language-text\">project>typings>core</code> core경로 하위에 <code class=\"language-text\">index.d.ts</code>파일을 선언한다. </p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">declare</span> global <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">interface</span> <span class=\"token class-name\">StringKeyDict<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">[</span>key<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<br>\n<p>그렇기 때문에 특정  컴포넌트에서 StringKeyDict 타입을 명시할 때 StringDict가 선언되어있는 파일을 import할 필요가 없어졌다. </p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token comment\">//  import { StringKeyDict } from '../../../../../types/src/typings';</span>\n<span class=\"token comment\">//  코드 삭제</span>\n\nselectedCategories<span class=\"token operator\">:</span> StringKeyDict <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<br>\n<p>이 방식을 사용함으로서 인터페이스를 매번 임포트해야하는 비용이 줄었다. 또한 직접 임포트하며 탐색하는 메모리 비용이 compilerOptions로 탐색하는 메모리 비용보다 적게 드는 것으로 알고있다(확실하지는 않다..) </p>\n<p>여러 타입을 관리하고 사용해야하는 큰 프로젝트에서는 좋은 경험이 될 것이다.</p>\n<h2 id=\"\" style=\"position:relative;\"><a href=\"#\" aria-label=\" permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<br>\n<br>\n<blockquote>\n<h3 id=\"참고-및-출처\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EB%B0%8F-%EC%B6%9C%EC%B2%98\" aria-label=\"참고 및 출처 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고 및 출처</h3>\n<ul>\n<li><a href=\"https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types\">@types, typeRoots and types </a></li>\n</ul>\n</blockquote>","frontmatter":{"title":"@types, typeRoots and types","date":"July 10, 2020"}}},"pageContext":{"slug":"/TypeScript/@types_typeRoots_and_types/","previous":{"fields":{"slug":"/Today I Learned/wrap_observably/"},"frontmatter":{"title":"Wrap Observably","category":"Today I Learned","draft":false}},"next":{"fields":{"slug":"/Algorithm/count_apples_and_oranges/"},"frontmatter":{"title":"count apples and oranges(사과와 오렌지)","category":"Algorithm","draft":false}}}},"staticQueryHashes":["3128451518","96099027"]}