/*
[ λ¬Έμ μκ° ]
λ€μ μꡬμ¬νμ λ§μ‘±νλ IsProductKey<T> νμ
μ μμ±νμΈμ
- IsProductKey νμ
μ μ‘°κ±΄λΆ νμ
μΌλ‘ λ€μ 쑰건μ λ°λΌ κ°κ° λ€λ₯Έ νμ
μΌλ‘ κ²°μ λ©λλ€.
- Tκ° Productμ key(νλ‘νΌν° μ΄λ¦)μ€ νλμΌ κ²½μ° κ²°κ³Όλ true νμ
μ΄ λ©λλ€.
- Tκ° Productμ key(νλ‘νΌν° μ΄λ¦)μ€ νλκ° μλ κ²½μ° κ²°κ³Όλ false νμ
μ΄ λ©λλ€.
- μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°μ΅λλ€.
- ex) IsProductKey<"id"> νμ
μ true νμ
μ΄ λ©λλ€.
- ex) IsProductKey<"author"> νμ
μ false νμ
μ΄ λ©λλ€.
*/
/* [Quiz] μλμ μ½λλ₯Ό μμ νμΈμ */
interface Product {
id: number;
name: string;
price: number;
seller: {
id: number;
name: string;
company: string;
};
}
type IsProductKey<T> = any;
/* [Test] μ¬κΈ°λΆν°λ μ λ΅μ 체ν¬νκΈ° μν μ©λλ‘ μμ νμ§ μμ΅λλ€ */
import { Equal, Expect } from "@type-challenges/utils";
type TestCases = [
Expect<Equal<IsProductKey<"id">, true>>,
Expect<Equal<IsProductKey<"name">, true>>,
Expect<Equal<IsProductKey<"author">, false>>,
Expect<Equal<IsProductKey<"winterlood">, false>>
];
type IsProductKey<T> = T extends keyof Product ? true : false;
/*
[ λ¬Έμ μκ° ]
λ€μ 쑰건μ λ§μ‘±νλ Extract<T, U> νμ
μ ꡬννμΈμ
- Extract<T, U> νμ
μ Tλ‘λΆν° Uλ§ μΆμΆνλ νμ
μ
λλ€.
- ex) Extract<string | boolean, boolean>μ boolean νμ
μ΄ λ©λλ€.
- ex) Extract<number | string, string>μ string νμ
μ΄ λ©λλ€.
(ννΈπ‘ κ°μ μ€ μ§μ ꡬννλ Exclude νμ
μ λ°λλΌκ³ μκ°ν΄λ³΄μΈμ!)
*/
/* [Quiz] μλμ μ½λλ₯Ό μμ νμΈμ */
type Extract<T, U> = any;
/* [Test] μ¬κΈ°λΆν°λ μ λ΅μ 체ν¬νκΈ° μν μ©λλ‘ μμ νμ§ μμ΅λλ€ */
import { Equal, Expect } from "@type-challenges/utils";
type TestCases = [
Expect<Equal<Extract<string | number, string>, string>>,
Expect<Equal<Extract<string | number, number>, number>>
];
type Extract<T, U> = T extends U? never : U;
/*
[ λ¬Έμ μκ° ]
λ°°μ΄ νμ
μ μμλ₯Ό μΆμΆνλ InferArrayType<T> νμ
μ ꡬννμΈμ
*/
/* [Quiz] μλμ μ½λλ₯Ό μμ νμΈμ */
type InferArrayType<T> = any;
/* [Test] μ¬κΈ°λΆν°λ μ λ΅μ 체ν¬νκΈ° μν μ©λλ‘ μμ νμ§ μμ΅λλ€ */
import { Expect, Equal } from "@type-challenges/utils";
const arr1 = [1, 2, 3];
const arr2 = ["hello", "myname", "winterlood"];
const arr3 = [1, true, "hi"];
type TestCases = [
Expect<Equal<InferArrayType<typeof arr1>, number>>,
Expect<Equal<InferArrayType<typeof arr2>, string>>,
Expect<Equal<InferArrayType<typeof arr3>, number | string | boolean>>
];
type InferArrayType<T> = T extends (infer R)[]? R :never;