๊ฐ์ฒด ์ ํ์ ์ฌ์ฉํ์ฌ ํค์ ๋ฌธ์์ด ๋๋ ์ซ์ ๋ฆฌํฐ๋ด ๊ฒฐํฉ์ ์์ฑํ๋ค.
type Point = {x: number; y: number};
type P = keyof Point; // x | y
๐ก ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- object์ ์ฌ์ฉํ๋ฉด object๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ key ๊ฐ์ union type์ผ๋ก ํฉ์ณ์ ๋ด๋ณด๋ด์ค๋ค.
- object์ ๋ค์ด์๋ key๋ฅผ ์ฌ์ฉํด์ ์๋ก์ด ํ์ ์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ ์ฐ์ฐ์์ด๋ค.
type IndexSignature = {
[k: string]: number;
}
type Index = keyof IndexSignature // string | number
const obj: IndexSignature = {
a: 1,
b: 2
};
๐ก ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- JavaScript ์ค๋ธ์ ํธํค๊ฐ ํญ์ ๋ฌธ์์ด์ ๊ฐ์ ๋๊ธฐ ๋๋ฌธ์ obj[0]์ ํญ์ obj[โ0โ]๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
let s = 'hello';
console.log(typeof s) // string
๋ค๋ฅธ ํ์ ์ฐ์ฐ์์ ์กฐํฉํ์ฌ Typeof๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ํจํด์ ์ฝ๊ฒ ํํํ ์ ์๋ค.
type Predicate = (x: unknown) => boolean;
type K = ReturnType<Predicate>; // boolean;
๐ก ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- ReturnType: ํ์ ์ด๋ ํจ์์ ๋ฐํ ํ์ ์ผ๋ก ์ ์ํ๋ค.
function f() {
return {x: 10, y: 3};
}
type P = ReturnType<typeof f>
// type P = {x: number, y: number};
๐ก ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- ๋ง์ฝ์ ํจ์์๋ ReturnType์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด! ํจ์๋ช ์ ๋ฃ์ง๋ง๊ณ ํจ์์ typeof๋ฅผ ์ ์ฉํด์ผ ํ๋ค.
์ ํ์ฌํญ
TypeScript๋ ์ฌ์ฉํ ์ ์๋ ์์ ์ข ๋ฅ๋ฅผ ์๋์ ์ผ๋ก ์ ํํ๋ค.
let shouldContinue: typeof msgbox("Are you sure you want to continue?");
โ์ฌ์ฌ์ฉโ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๋๊ตฌ ์ค ํ๋
๐ก ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- ๋จ์ผ ํ์ ์ด ์๋ ๋ค์ํ ํ์ ์์ ์๋ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ ์๋ค.
- ์ฌ์ฉ์๋ Generic์ ํตํด ์ฌ๋ฌ ํ์ ์ ์ปดํฌ๋ํธ๋ ์์ ๋ง์ ํ์ ์ ์ฌ์ฉํ ์ ์๋ค.
์ ์ธ ์์ ์ด ์๋๋ผ ์์ฑ ์์ ์ ํ์ ์ ๋ช ์ํ์ฌ ํ๋์ ํ์ ๋ง์ด ์๋ ๋ค์ํ ํ์ ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฒ
function identity<T>(arg: T): T{
return arg;
}
identity<string>('Hello World!');
identity('Hello World!'); // ํ์
์ถ๋ก
T๋ Type์ ์ฝ์๋ก Generic์ ์ ์ธํ ๋ T(ํ์ ๋ณ์)๋ฅผ ๊ด์ฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
ํจ์๊ฐ ์์ฑ(ํธ์ถ)๋๋ ์์ ์ string ํ์ ์ด ๋ช ์๋๋ค.
๋ํ paremeter์ ๋ํ ํ์ ๊ณผ return์ ๋ํ ํ์ ์ด ๋์ผํ์ง ๊ฒ์ฆํ ์ ์๋ค.
๐ก ์ง๊ณ ๋์ด๊ฐ๊ธฐ
Generic์ ์ฌ์ฉํด์ผ ํ๋ ์ด์
- Generic์ด ์๋ค๋ฉด ํ์ ์ ๋ฏธ๋ฆฌ ์ง์ ํ๊ฑฐ๋, any๋ฅผ ์ด์ฉํด์ ํ์ ์ ์์ฑํด์ผ ํ๋ค.
- ํ์ ์ ๋ฏธ๋ฆฌ ์ง์ ํ๊ฒ ๋๋ฉด ๋ฒ์ฉ์ฑ์ด ๋จ์ด์ง๋ค.
any๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์ ์ ํํ ์ ์๊ณ , parameter์ return์ ํ์ ์ ํ์ธํ ์ ์๋ค.- ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง ์๊ฑฐ๋, ํ์ ์ ๋ํ ๊ฒ์ฆ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ Generic์ ์ฌ์ฉํ๋ค.
function identity<T>(arg: T): T {
console.log(arg.length); // error ๋ฐ์
return arg;
}
๐ก ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- ๋ง์ฝ ํ์ ๋ณ์ T์ ๋ฐฐ์ด์ด ๋ค์ด์๋ค๋ฉด error๊ฐ ๋ฐ์ํ์ง ์์ง๋ง
ํ์ ๋ณ์ T๋ ์ ํด์ง์ง ์์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ .length ํ๋กํผํฐ๊ฐ ์ ํจํ๋ค๊ณ ํ๋จํ ์ ์๋ค.- T(ํ์ ๋ณ์)์ ๋ํ ์ธ๋ถ์ ์ธ ๋ณ์ ํ์ ์ ์ง์ ํ๋ค.
function identity<T>(arg: T[]): T[] { console.log(arg.length); return arg; }
- Generic ํจ์ identity๋ ํ์ ๋ณ์ T์ T ๋ฐฐ์ด ์ธ์ arg๋ฅผ ์ทจํ๊ณ T ๋ฐฐ์ด์ ๋ฐํํ๋ค.
function identity<T>(arg: T): T {
return arg;
}
let myIdentity: <T>(arg: T) => T = identity;
let myIdentity: { <T>(arg: T): T } = identity;
interface GenericIdentity<T> {
(arg: T): T;
}
function identity<T>(arg: T): T {
return arg;
}
let checkIdentity: GenericIdentity = identity;
let checkIdentity: GenericIdentity<number> = identity; // type ๊ฐ์กฐ
class GenericMath<T> {
pi: T;
sum: (x: T, y: T) => T;
}
let math = new GenericMath<number>();
math.pi = 3.14;
math.sum = (x, y) => {return x + y};
function identity<T>(arg: T): T {
console.log(arg.length); // error ๋ฐ์
return arg;
}
interface Lengthwise {
length: number;
}
function identity<T extends Lengthwise>(arg: T): T {
console.log(arg.length)
return arg;
}
identity("string")
identity({ length: 10, value: 3})
๐ก ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ ์ฝ์กฐ๊ฑด์ ๋ช ์ํ ์ ์๋ค.
- extends๋ฅผ ์ฌ์ฉํด์ type์ ํ์ฅํ ์ ์๋ค.
- .length ํ๋กํผํฐ๊ฐ ์๋ type์ ์ฌ์ฉํ๋ ค๋ฉด length์ ๋ํ ๋ช ์๋ฅผ ํด์ค์ผ ํ๋ค.