LearningTS Chapter 15 - YDP-SPLOUNGE-CLUB/typescript-study GitHub Wiki
νμ μ€ν¬λ¦½νΈλ λ€λ₯Έ νμ μ μμ±λ₯΄ κΈ°λ°μΌλ‘ μλ‘μ΄ νμ μ μμ±νλ ꡬ문μ μ 곡νλ€.
// example
type NewType = {
[K in OriginalType]: NewProperty;
}λ§€νλνμ μ λν μΌλ°μ μΈ μ¬μ© μ¬λ‘λ μ λμΈ νμ μ νΌν©νμ¬ μμ©νμ¬ κ° λ¬Έμμ΄ λ¦¬ν°λ΄ ν€λ₯Ό κ°μ§ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄λ€.
type Animals = "alligator" | "baboon" | "cat";
type AnimalCounts = {
[K in Animals]: number;
};μΌλ°μ μΌλ‘ λ§€νλ νμ μ μ‘΄μ¬νλ νμ μ keyof μ°μ°μλ₯Ό μ¬μ©ν΄ ν€λ₯Ό κ°μ Έμ€λ λ°©μμΌλ‘ μλνλ€.
μ‘΄μ¬νλ νμ μ ν€λ₯Ό λ§€ννλλ‘ νλΉμ μ§μνλ©΄ μλ‘μ΄ νμ μΌλ‘ λ§€νλλ€.
interface AnimalVariants {
aliigator: boolean;
baboon: number;
cat: string;
}
type AnimalCounts = {
[K in keyof AnimalVariants]: number;
}μ΄μ μ€λν«μμ K λ‘ λͺ λͺ λ keyof μ λ§€νλ μλ‘μ΄ νμ ν€λ μλ νμ μ ν€λ‘ μλ €μ Έ μλ€. μ¦ κ° λ§€νλ νμ λ©€λ² κ°μ λμΌν ν€ μλμμ μλ νμ μ ν΄λΉ λ©€λ² κ°μ μ°Έμ‘°ν μ μλ€.
μλ³Έ κ°μ²΄κ° SomeName μ΄κ³ λ§€νμ΄ [K in keyof SomeName]μΈ κ²½μ°λΌλ©΄ λ§€νλ νμ μ κ° λ©€λ²λ SomeName λ©€λ²μ΄ κ°μ SomeName[K] λ‘ μ°Έμ‘°ν μ μλ€.
interface BirdVariants {
dove: string;
eagle: boolean;
}
type NullableBirdVarinats = {
[K in keyof BirdVariants]: BirdVariants[K] | null;
}μΈν°νμ΄μ€ λ©€λ²λ₯Ό ν¨μλ‘ μ μΈνλ λ κ°μ§ λ°©λ²μ μ μνμλ€.
- member(): void ꡬ문 : μΈν°νμ΄μ€ λ©€λ²κ° κ°μ²΄μ λ©€λ²λ‘ νΈμΆλλλ‘ μλλ ν¨μμμ μ μΈ
- member: () => void ꡬ문 : μΈν°νμ΄μ€μ λ©€λ²κ° λ 립 μ€νν ν¨μμ κ°λ€κ³ μ μΈ
λ§€νλ νμ μ κ°μ²΄ νμ μ λ©μλμ μμ± κ΅¬λ¬Έμ ꡬλΆνμ§ μλλ€. λ§€νλ νμ μ λ©μλλ₯Ό μλ νμ μ μμ±μΌλ‘ μ·¨κΈ
interface Researcher {
researchMethod(): void;
researchProperty: () => string;
}
type JustProperties<T> = {
[K in typeof T]: T[K]
};
type ResearcherProperties = JustProperties<Researcher>;
// λ€μκ³Ό κ°λ€.
// {
// researchMethod: () => void;
// researchProperty: () => string;
// }λ§€νλ νμ μ μλ νλΉμ λ©€λ²μ λν΄ μ κ·Ό μ μ΄ μ νμμΈ readonly μ ? λ λ³κ²½ κ°λ₯νλ€.
μ νμ μΈ μΈν°νμ΄μ€μ λμΌν ꡬ문μ μ¬μ©ν΄ λ§€νλ νμ μ λ©€λ²μ readonly μ ? λ₯Ό λ°°μΉ κ°λ₯νλ€.
interface Enviromentalist{
area: string;
name: string;
}
type ReadOnlyEnviromentalist = {
readonly [K in keyof Enviromentalist]: Enviromentalist[K];
};
// λ€μκ³Ό κ°μ
// {
// readonly area: string;
// readonly name: string;
// }
type OptionalReadOnlyEnviromentalist = {
[K in keyof ReadOnlyEnviromentalist]?: Enviromentalist[K];
};μλ‘μ΄ νμ μ νμ μμ - λ₯Ό μΆκ°ν΄ μ νμλ₯Ό μ κ±° κ°λ₯νλ€.
interface Conservationist {
name: string;
catchphrase?: string;
readonly born: number;
readonly died?: number;
}
type WrtableConservationist = {
-readonly [K in keyof Conservationist]: Conservationist[K];
};
// λ€μκ³Ό κ°μ.
// {
// name: string;
// catchprase?: string;
// born: number;
// died?: number;
// }
type RequireWritableConservationist = {
[K in keyof WrtableConservationist]-?: WrtableConservationist[K];
};λ§€νλ νμ μ μμ ν νμ μ λ€λ¦κ³Ό κ²°ν©ν΄ λ¨μΌ νμ μ λ§€νμ λ€λ₯Έ νμ μμ μ¬μ¬μ©ν μ μλλ‘ νλ κ²μμ λμ¨λ€.
λ§€νλ νμ μ λ§€νλ νμ μ체μ νμ λ§€κ°λ³μλ₯Ό ν¬ν¨ν΄ keyof λ‘ ν΄λΉ μ€μ½νμ μλ λͺ¨λ νμ μ΄λ¦μ μ κ·Όν μ μλ€.
μ λ€λ¦ λ§€νλ νλΉμ λ°μ΄ν°κ° μ ν리μΌμ΄μ μ ν΅ν΄ νλ₯Ό λ λ°μ΄ν°κ° μ΄λ»κ² λ³νλλμ§ λνλΌ λ μ μ©νλ€.
type MakeReadonly<T> = {
readonly [K in keyof T]: T[K];
}
interface Species {
genus: string;
name: string;
}
type ReadonlySpecies = MakeReadonly<Species>;κ°λ°μλ€μ΄ μΌλ°μ μΌλ‘ ννν΄μΌ νλ λ λ€λ₯Έ λ³νμ μμμ μμ μΈν°νμ΄μ€λ₯Ό λ°κ³ κ·Έ μΈν°νμ΄μ€μ μμ ν μ±μμ§ μΈμ€ν΄μ€λ₯Ό λ°ννλ ν¨μμ΄λ€.
interface GenusData {
family: string;
name: string;
}
type MakeOptinal<T> = {
[K in keyof T]?: T[K];
}
function createGenusData(overrides?: MakeOptinal<GenusData>): GenusData {
return {
family: 'unknown',
name: 'unknown',
...overrides,
}
}κΈ°μ‘΄ νμ μ λ€λ₯Έ νμ μ λ§€ννλ κ²μ νλ₯νμ§λ§ μμ§ νμ μμ€ν μ λ Όλ¦¬μ μ‘°κ±΄μ΄ μΆκ°λμ§ μμλ€.
νμ μ€ν¬λ¦½νΈμ νμ μμ€ν μ λ Όλ¦¬ νλ‘κ·Έλλ° μΈμ΄μ ν μμ΄λ€.
νμ μμ€ν μ μ΄μ νμ μ λν λ Όλ¦¬μ μΈ κ²μ¬λ₯Ό λ°νμΌλ‘ μλ‘μ΄ κ΅¬μ±μ μμ±νλ€. μ‘°κ±΄λΆ νμ μ κ°λ μ
κΈ°μ‘΄ νμ μ λ°νμΌλ‘ λ κ°μ§ κ°λ₯ν νμ μ€ νλλ‘ νμΈλλ νμ μ΄λ€.
μ‘°κ±΄λΆ νμ ꡬ문μ μΌν μ°μ°μ 쑰건문μ²λΌ 보μΈλ€.
LeftType extends RightType ? IfTrue : IfFalse;μ‘°κ±΄λΆ νμ μμ λ Όλ¦¬μ κ²μ¬λ νμ extends μ μΌμͺ½ νμ μ΄ μ€λ₯Έμͺ½ νμ μ΄ λλμ§ λλ ν λΉ κ°λ₯νμ§ μ¬λΆμ μλ€.
λ€μ CheckStringAgainstNumber μ‘°κ±΄λΆ νμ μ string | number κ° λλμ§ μ¬λΆλ₯Ό κ²μ¬νλ€.
string νμ μ number νμ μ ν λΉν μ μλμ§ μ¬λΆμ΄λ€. ν λΉν μ μλ€λ©΄ κ·Έ κ²°κ³Ό νμ μ false κ° λλ€.
type CheckStringAginstNumber = string extends number ? true : false;μ‘°κ±΄λΆ νμ μ μ‘°κ±΄λΆ νμ μ체μ νμ λ§€κ°λ³μλ₯Ό ν¬ν¨ν ν΄λΉ μ€μ½νμμ λͺ¨λ νμ μ΄λ¦μ νμΈν μ μλ€.
μ¦ λͺ¨λ λ€λ₯Έ νμ μ κΈ°λ°μΌλ‘ μλ‘μ΄ νμ μ μμ±νκΈ° μν΄ μ¬μ¬μ© κ°λ₯ν μ λ€λ¦ νμ μ μμ±ν μ μλ€.
type CheckAgaubstNumber<T> = T extends number ? true : false;
// νμ
: false
type CheckString = CheckAgaubstNumber<'parakeet'>;
// νμ
: true
type CheckString = CheckAgaubstNumber<1111>;
// νμ
: true
type CheckString = CheckAgaubstNumber<number>;interface QuertOptions {
thorwIfNotFound: boolean;
}
type QueryResult<Options extends QuertOptions> =
Options["thorwIfNotFound"] extends true ? string : string | undefined;
declare function retrieve<Options extends QuertOptions>(
key: string,
options?: Options,
): Promise<QueryResult<Options>>;
// λ°ν νμ
string | undefined;
await retrieve("Mary");
// string | undefined;
await retrieve("Jane", { thorwIfNotFound: Math.random() > 0.5 });
// string
await retrieve("Dian", { thorwIfNotFound: true });type ArrayifUnlessString<T> = T extends string ? T: T[];
// string | number[]
type HalfArrayified = ArrayifUnlessString<string | number>;νμ μ€ν¬λ¦½νΈμ μ‘°κ±΄λΆ νμ μ΄ μ λμΈμ λΆμ°λμ§ μλλ€λ©΄ string | number λ string μ ν λΉν μ μκΈ° λλ¬Έμ HalfArrayified λ (string | number)[] κ° λλ€.
μ 곡λ νμ μ λ©€λ²μ μ κ·Όνλ κ²μ νμ μ λ©€λ²λ‘ μ μ₯λ μ 보μ λν΄μλ μ μλνμ§λ§ ν¨μ λ§€κ°λ³μ λλ λ°ν νμ κ³Ό κ°μ λ€λ₯Έ μ 보μ λν΄μλ μ μ μλ€.
μ‘°κ±΄λΆ νμ μ extends μ μ infer ν€μλλ₯Ό μ¬μ©ν΄ 쑰건μ μμμ λΆλΆμ μ κ·Όνλ€.
extends μ μ νμ μ λν infer ν€μλμ μ μ΄λ¦μ λ°°μΉνλ©΄ μ‘°κ±΄λΆ νμ μ΄ true μΈ κ²½μ° μλ‘μ΄ νμ μ μ¬μ©ν μ μμμ μλ―Ένλ€.
infer μ΄λ μ λ€λ¦ νλΌλ―Έν°μ λ€μ΄κ° νμ μ λ½μλ΄ λ€λ₯Έ λ³μμ λ£μ΄λμ΄ νμ μ μ μΈν λ μ¬μ©νκΈ°λνλ€.
type ArrayItems<T> =
T extends (infer item)[]
? item
: T;
// string
type StringItem = ArrayItems<string>;
// string
type StringArrayItem = ArrayItems<string[]>;
// string[]
type String2DItem = ArrayItems<string[][]>;νμ λ§€κ°λ³μ Tλ₯Ό λ°κ³ μλ‘μ΄ Item νμ μ λ°°μ΄μΈμ§ νμΈνλ€. μλ‘μ΄ Item νμ μ λ°°μ΄μΈ κ²½μ° κ²°κ³Ό νμ μ Item μ΄ λκ³ κ·Έλ μ§ μμΌλ©΄ T κ° λλ€.
// infer μ κ°μ μμΉμ μλ string νμ
μ R λ³μμ μ μΈνλ€.
type ArrType<T> = T extends (infer R)[] ? R : unknown;
type arr = ArrType<string[]>; // string νμ
μ΄λ€.
type arr2 = ArrType<string>; // unknown νμ
μ΄λ€.λ§€νλ νμ μ κΈ°μ‘΄ νμ μ λͺ¨λ λ©€λ²μ λ³κ²½ μ¬νμ μ μ©νκ³ μ‘°κ±΄λΆ νμ μ νλμ κΈ°μ‘΄ νμ μ λ³κ²½ μ¬νμ μ μ©νλ€.
type MakeAllMembersfunctions<T> = {
[K in keyof T]: T[K] extends (...args: any[]) => any
? T[K]
: () => T[K]
};
type MemberFunctions = MakeAllMembersfunctions<{
alreadyFunction: () => string,
notYetFunction: number;
}>
//
// {
// alreadyfunction: () => string;
// notYetFUnction: () => number;
// }λ¬Έμμ΄κ°μ μ λ ₯νκΈ° μν λ κ°μ§ μ λ΅μ μ μν μ μ΄ μλ€.
μμ string νμ : κ°μ΄ μΈμμ λͺ¨λ λ¬Έμμ΄μ΄ λ μ μλ κ²½μ° "" μ "abc" κ°μ 리ν°λ΄ νμ : κ°μ΄ μ€μ§ ν κ°μ§ νμ λ§ λ μ μλ κ²½μ°
λ¬Έμμ΄ νμ μ΄ ν¨ν΄μ λ§λμ§λ₯Ό λνλ΄λ νμ μ€ν¬λ¦½νΈ κ΅¬λ¬ΈμΈ ν νλ¦Ώ 리ν°λ΄ νμ μ μ λ ₯ν΄λ³΄μ
type Greeting = `Hello${string}`;
let matches: Greeting = "Hello, world!"; // OK
let outOfOrder: Greeting = "World! Hello"; // Errortype Brightness = "dark" | "light";
type Color = "blue" | "red";
type BrightnessAndColor = `${Brightness}-${Color}`;
let colorOk: BrightnessAndColor = "dark-blue";λ¬Έμμ΄ νμ μμ μ μ§μνκΈ° μν΄ νμ μ€ν¬λ¦½νΈλ λ¬Έμμ΄μκ°μ Έμ λ¬Έμμ΄μ μΌλΆ μ‘°μμ μ μ©νλ κ³ μ μ λ€λ¦ μ νΈλ¦¬ν° νμ μ μ 곡νλ€.
- Uppercase
- Lowercase
- Capitalize
- Uncapitalize
type FormalGreeting = Capitalize<"hello,">; // Hello,const config = {
location: 'unknown',
name: "annoymous",
year: 0,
}
type LayValues = {
[K in keyof typeof config as `${K}Lazy`]: () => Promise<typeof config[K]>;
};
async function withLazyValues(configGetter: LayValues) {
await configGetter.locationLazy; // string
await configGetter.missingLazy; // Error Propery missingLazy does not exist
}μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄ ν€λ string λλ Symbol μ΄ λ μ μκ³ Symbol ν€λ μμ νμ μ΄ μλλ―λ‘ ν νλ¦Ώ 리ν°λ΄ νμ μΌλ‘ μ¬μ©ν μ μλ€.
type TurnIntoGettersDirect<T> = {
[K in keyof T as `get${K}`]: () => T[K]
// Error
}μ΄λ¬ν μ ν μ¬νμ νΌνκΈ° μν΄ string κ³Ό κ΅μ°¨ νμ & μ μ¬μ©νμ¬ λ¬Έμμ΄μ΄ λ μ μλ νμ λ§ μ¬μ©νλλ‘ κ°μ νλ€.
string & symbol μ never κ° λλ―λ‘ μ 체 ν νλ¦Ώ λ¬Έμμ΄μ neverκ° λλ―λ‘ μ 체 ν νλ¦Ώ λ¬Έμμ΄μ never κ° λκ³ νμ μ€ν¬λ¦½νΈλ μ΄λ₯Ό 무μνλ€.
const someSymbol = Symbol("");
interface HasStringAndSymbol {
Stringkey: string;
[someSymbol]: number;
}
type TurnIntoGetters<T> = {
[K in keyof T as `get${string & K}`]: () => T[K]
};
type GettersJustString = TurnIntoGetters<HasStringAndSymbol>;
// λ€μκ³Ό κ°μ.
// {
// getStringkey: () => string;
// }