์ข ๋ฅ
- ํ์ผ ๊ด๋ จ ์ค์
- ์ปดํ์ผ ๊ด๋ จ ์ค์
- JS ๋ฌธ๋ฒ ๊ด๋ จ
- ๋ชจ๋ ์์คํ ๊ด๋ จ
- ์ ์ธ ํ์ผ ๊ด๋ จ (d.ts)
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ จ
- files, include, exclude : ์ํ๋ ํ์ผ์ ์ ํํ๊ณ , ์ ์ธํ๋ ์ค์
- ๊ฒฝ๋ก๋ tsconfig.json์ ์์น์์ ์๋๊ฒฝ๋ก๋ก ์์ฑํ๋ฉด ๋๋ค.
tsc target.ts
ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.["node_modules", "bower_components", "jspm_packages"]
์ย outDir์ ์ง์ ํ ๊ฒฝ๋ก๊ฐ ๊ธฐ๋ณธ๊ฐ
- ์ปดํ์ผ ๊ด๋ จ ์ค์
- JS ๋ฌธ๋ฒ ๊ด๋ จ
- ๋ชจ๋ ์์คํ ๊ด๋ จ
- ์ ์ธ ํ์ผ ๊ด๋ จ (d.ts)
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ จ
esModuleInterop: true
๋ฉด ํธํํด์ค๋ค.module1
์ด commonjs๋ฐฉ์์ผ๋ก ์์ฑ๋์ด export ๋์ด ์๋ค๋ฉด esmodule ๋ฐฉ์์ผ๋ก module1
์ importํ ๋ ํธํ์ด ๋์ง ์๋๋ค. ์ด๋ฅผ ํด๊ฒฐํด์ฃผ๋ ์ต์
isolatedModules: true
๋ก ์ค์ ํ๋ฉด ๋ชจ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์ง ์์ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ์ถ๋ ฅํ๋ค.์๋์ vs ๋น์๋์ ๋ชจ๋ import
- ์๋์ :
/
,./
,../
์ค ํ๋๋ก ์์ํ๋ค.- ๋น์๋์ : ์ด์ธ์ ๋ชจ๋์ ๋ชจ๋ ๋น์๋์ ์ผ๋ก ๊ฐ์ฃผ๋๋ค.
- baseUrl๋ก ํด์๋๊ฑฐ๋, ambient ๋ชจ๋ ์ ์ธ์ผ๋ก ํด์๋ ์ ์๋ค.
classic
in modern codedeclaration: true
tsํ์ผ์ d.ts๋ ์ปดํ์ผ ๊ฒฐ๊ณผ๋ก ๋ง๋ค์ด์ง๋ค.emitDeclarationOnly: true
๋ผ๋ฉด ์ปดํ์ผ ๊ฒฐ๊ณผ๋ก d.ts ํ์ผ๋ง ์์ฑ๋๋ค.skipLibCheck: true
์ ๊ฒฝ์ฐ d.ts ํ์
์ฒดํฌ๋ฅผ ์๋ตํ๋ค.export, import
ํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.)
- https://www.npmjs.com/package/tsd
- type ์ ์ธ์ ๋ํ ํ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (d.ts ํ์ผ ๋ฑ)
- ํ ์คํธ ์ผ์ด์ค ํ์ผ์ธ
.test-d.ts
ํ์ผ์ ์คํ๋์ง ์๊ณ , ์ปดํ์ผ๋์ง ์๋๋ค.
declare function _(selector: string): string;
export default _;
import { expectType } from 'tsd';
import _ from '../../src/index.d';
expectType<string>(_('string'));
expectType<number>(_('string')); // ERROR
npx tsd
๋ฅผ ํตํด ํ์
ํ
์คํธ๋ฅผ ์งํํ๋ค. ๋ง์ฝ ํ
์คํธ๊ฐ ํต๊ณผํ๋ค๋ฉด ์๋ฌด ์ค๋ช
๋ ์ถ๋ ฅ๋์ง ์๊ณ ,
์คํจํ์ ๊ฒฝ์ฐ์๋ง ์๋ฌ์ ๋ํ ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋๋ค.
{
"name": "ts-module",
...
"tsd": {
...
}
}
์ฐ์ ๋์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ์ด๋ ๋ค.
root
๐ __tests__
๐ @types
๐ type.test.ts
... ๋ค๋ฅธ ํ
์คํธ ๊ด๋ จ ํ์ผ๋ค (jest ๋ฑ)
"tsd": {
"directory": "./__tests__/@types"
}
@types
๋ก ๋ถ๋ฆฌํ ์ด์ ๋ ํ
์คํธ ๋จ์๋ฅผ ๋๋ ํ ๋ฆฌ๋ก ๋ฌถ๊ธฐ ์ํด์๋ค.
tsd.directory
- ํ ์คํธ๊ฐ ์ฌ๋ฌ ํ์ผ๋ก ๋ถ์ฐ๋์ด ์๋ ๊ฒฝ์ฐ ํ ์คํธ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํด ์ค ์ ์๋ค.
๋ค๋ฅธ ์ ์ฉํ ๊ฒ ๊ฐ์ ์ค์ ์ compilerOptions์ด๋ค.
compilerOptions
- ํ๋ก์ ํธ์ tsconfig.json์ด ์กด์ฌํ ๋ overrideํ ์ ์๋ค.
- ๋ง์ฝ vscode์ type checker์ ์ค์ ์ ๋ค๋ฅด๊ฒ ํ ๊ฒ์ด๋ผ๋ฉด ์ ์ฉํ๊ฒ ์ธ ์ ์์ ๊ฒ ๊ฐ๋ค.
(moduleResolution ์ต์ ์ override ๋ถ๊ฐ๋ฅ)
expectType์ ๊ตฌํ๋ถ๋ ์ด์ ๊ฐ๋ค.
/**
* Asserts that the type of `expression` is identical to type `T`.
*
* @param expression - Expression that should be identical to type `T`.
*/
// @ts-expect-error
const expectType = (expression) => {
// Do nothing, the TypeScript compiler handles this for us
};
exports.expectType = expectType;
// d.ts
/**
* Asserts that the type of `expression` is identical to type `T`.
*
* @param expression - Expression that should be identical to type `T`.
*/
export declare const expectType: <T>(expression: T) => void;
๋ณด๋ฉด ๊ตฌํ๋์ด ์๋๊ฒ ์๋ค. ์์ํด๋ณด๋ฉด ๊ทธ๋ฅ type checker์๊ฒ ๋งก๊ฒจ๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค.
์๋ง๋ ์ด๋ ค์ด ํ์
์ ์ ํํ๊ฒ ์ค๊ณํด์ผ ํ ๋ ์ ์ฉํ์ง ์์๊น ์ถ๋ค.
์ด๋ฒ ๋ฏธ์
์์ omit์ด๋ผ๋ ์ ํธํจ์๋ฅผ ๋ง๋ค์ด์ผํ๊ณ , ์ด์ ๋ํ ํ์
๋ ์ง์ ํด์ค์ผ ํ๋ค.
์ฌ๋ฌ ํฌ๋ฃจ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๊ณ , ๊ฒฐ๋ก ์ ์ด๋ฐ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์๋ค.
function omit<T extends object, K extends keyof T>(
object: T,
target: K | K[]
): Omit<T, K>
// ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์จ ๊ฐ์ฒด์์ (object)
// ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์จ ํ๋กํผํฐ(target)๋ฅผ ์ ๊ฑฐํ ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผํ๋ค.
tsd๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์ด ํ๋ ธ๋์ง ์๋์ง ์ฝ๊ฒ ํ์ธํด๋ณผ ์ ์๋๋ฐ ์ฌ๋ฌ assertions(expectType, expectNotType ๋ฑ)๋ฅผ ํ์ฉํด๋ณด๋ฉด ์ ํํ ๊ตฌํํ๋์ง ํ์ธํ ์ ์๋ค.
expectType<Omit<{ a: 'a'; b: 'b' }, 'a'>>(omit({ a: 'a', b: 'b' }, 'a'));
// c๋ฅผ ๋บ์ผ๋ a, b๋ง ํฌํจํด์ผ ๋๋ค.
expectNotType<{ a: 'a'; b: 'b'; c: 'c' }>(
omit({ a: 'a', b: 'b', c: 'c' }, 'c')
);
// c๋ฅผ ๋บ์ผ๋ c๋ ํฌํจ๋์ด ์์ผ๋ฉด ์๋๋ค.
expectError<{ a: 'a'; b: 'b'; c: 'c' }>(
omit({ a: 'a', b: 'b', c: 'c' }, 'c')
);
// c๊ฐ return ํ์
์ ํฌํจ๋์ด ์๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
๋, ts-loader๋ฅผ ์ฐ๋ ์ด์ ์ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋๋ฐ, ts-loader๋ babel-loader์ ๋ฌ๋ฆฌ ํ์ ์ฒดํน๋ ์งํํ๋ค. ํ์ง๋ง vscode์๋ type checker๊ฐ ๋ด์ฅ๋์ด ์์ด์ ์ด๋ฏธ ํ์ ์ฒดํน์ด ์งํ๋๊ณ ์๋ค. ์ด์ ๋ ts-loader๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ฐ๋ ฅํ ํ์ ์ฒดํน์ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. (vscode type checker๊ฐ ์ค๋ฅ๋ก ์ธํด ์ ๋๋ก type checking์ ์คํจํด์ ๋ฐํ์์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ ์์ ์ฐจ๋จ)
tsd๋ ๋น์ทํ ๋งฅ๋ฝ์ด ์๋๊น ๐
Amidst the fragrant aroma of freshly brewed coffee, I settled into my seat for an evening of cinematic indulgence, eager to lose myself in the enchanting world of storytelling. Tonight's film offered an opportunity to challenge my perceptions and explore uncharted territories, and I embraced it with enthusiasm. With each unfolding https://gidonline-io.online/ scene, I admired the craftsmanship and ingenuity of the filmmakers, who brought their vision to life with breathtaking visuals and compelling narratives. From expansive landscapes to intimate character moments, I was transported to a universe of endless possibilities. In those exhilarating moments, I felt a sense of wonder and excitement, as if I were embarking on a grand adventure of my own.
ํ๋ฐํ ํฌ์คํ ๋ณด๊ธฐ์ข๋ค์ :)