2024-03-06.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 1์ฃผ์ฐจ-3
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week1-3_2024-03-06
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ------ | ------------------------------ | ----------- | | 1์ฃผ์ฐจ | 1, 2์ฅ | ๋ฆฌ์กํธ ํต์ฌ์์์ ์๋ฐ์คํฌ๋ฆฝํธ | 93p~123p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์ฝ์ ์๊ฐ: 8์ 45๋ถ~12์
์ค๋ ๋ง์ด ์ฝ์ด์ผํจ, ๋ชฉํ 2.x๊น์ง? => ใ
Array
์ map, filter, reduce, forEach
- [ES5]์ด๋๊น ํธ๋์คํ์ผ, ํด๋ฆฌํ ๋ถ๋ด์์
- ๊ธฐ์กด ๋ฐฐ์ด์ ๊ฐ ๊ฑด๋๋ฆฌ์ง ์์ผ๋ฏ๋ก ์์ ~
- ๐reduce ํ ์ค ์ค๋ช : ์ฝ๋ฐฑํจ์์ ํจ๊ป ์ด๊ธฐ๊ฐ์ ์ธ์๋ก ๋ฐ๋๋ฐ, ์ด๊ธฐ๊ฐ์ ๋ฐ๋ผ ๋ฐฐ์ด, ๊ฐ์ฒด ๋ฑ์ ๋ฐํํ ์ ์๋ Array ํ๋กํ ํ์ ์ ๋ฉ์๋์ด๋ค
// ๊ฐ๋
์ฑ์ ์ฃผ๋ชฉ
const result1 = arr.filter((item) => item % 2 === 0).map((item) => item * 100); // ํ์ง๋ง ๋ฐฐ์ด์ 2๋ฒ ๋๋ค
const result3 = arr.reduce((result, item) => {
if (item % 2 === 0) result.push(item);
return result;
}, []);
- forEach์ ํน์งs
- ๋ฐํ๊ฐ: undefined
- break, returnํด๋ ์ํ๋ฅผ ๋ฉ์ถ ์ ์์: ๋ฌด์กฐ๊ฑด O(n)
- ECMAScript
- https://github.com/tc39/proposals
TypeScript
- TypeScript is JavaScript with syntax for types.
- ๋์ ํ์
์ธ์ด์ ๋จ์ : ์๋ฌ๋ฅผ ์ฝ๋๋ฅผ ์คํํ์ ๋ ํ์ธํ๋ค
- => ํ์ ์คํฌ๋ฆฝํธ: ํ์ ์ฒดํฌ๋ฅผ ์ ์ ์ผ๋ก ๋ฐํ์์ด ์๋ ๋น๋(ํธ๋์คํ์ผ) ํ์์ ์ํ
- TypeScript Playground: https://www.typescriptlang.org/play
| ๊ตฌ๋ถ | ๊ธฐ๋ฅ | ์ฌ์ฉ ์์ | | --------------- | ----------------------------------- | -------------------------------------------------- | | instanceof | ํน์ ํด๋์ค์ ์ธ์คํด์ค์ธ์ง ํ์ธ | ์๋ฌ ํธ๋ค๋ง ์ ์ฌ์ฉ (HttpError, AxiosError etc...) | | typeof | ํน์ ๊ฐ์ ์๋ฃํ์ธ์ง ํ์ธ | ์์์ ์๋ฃํ ์ฒดํฌ | | in | property in object | ์ฃผ๋ก ์ด๋ค ๊ฐ์ฒด์ ํค๊ฐ ์กด์ฌํ๋ ํ์ธ | | generic | ๋จ์ผ ํ์ ์ด ์๋ ๋ค์ํ ํ์ ์ ๋์ | useState ์ ์ธํ ๋ ๋ง์ด ๋ด | | index signature | ํค์ ์ํ๋ ํ์ ์ ๋ถ์ฌํ ์ ์๋ค | ํ์ ๋จ์ธ hello[key as keyof Hello] |
๊ทธ ์ธ
- Flow๋ผ๋ ์ ์ ํ์
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์๋ค(ํ์ด์ค๋ถ)
- ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ์ ๋ํ ์ด์
- (ํ์ด์ค๋ถ) yarn์ด๋ jest๋ TS๋ก ์ฌ์์ฑ๋จ
- (MS) VSC์ Definitely Typed
@types
unknown
- top type, type narrowing์ด ํ์
function doSomething(callback: unknown) {
if (typeof callback === "function") {
callback();
return;
}
throw new Error("callback is not a function");
}
never
- bottom type
- ์ด๋๋ค ์ฐ๋?
- class component์์ Props๊ฐ ๋น์์์ ๋ํ๋ผ ๋
type Props = Record<string, never>
- class component์์ Props๊ฐ ๋น์์์ ๋ํ๋ผ ๋
Generic
- ์ ๋๋ฆญ
function multipleGeneric<First, Last>(a1: First, a2: Last): [First, Last] {
return [a1, a2];
}
const [a, b] = multipleGeneric<stirng, boolean>("true", true);
- ์ธ๋ฑ์ค ์๊ทธ๋์ฒ
// type Hello = Record<"hello" | "hi", string>;
type Hello = { [key in "hello" | "hi"]: string };
const hello: Hello = {
hello: "๐",
hi: "๐๏ธ",
};
- key ๋จ์ธ
Object.keys(hello).map((key) => hello[key as keyof Hello]);
- keysOf ํฌํผ๋ฅผ ๋ง๋ค์ด์, string[] ๋์ ๊ฐ๋ฐ์๊ฐ ๋จ์ธํ ํ์ ์ผ๋ก ๊ฐ์ ํ๊ธฐ
function keysOf<T extends Object>(obj: T): Array<keyof T> {
return Array.from(Object.keys(obj)) as Array<keyof T>;
}
keysOf(hello).map((key) => hello[key]);
Object.keys
๊ฐ string[]
์ผ๋ก ๊ฐ์ ๋์ด ์๋ ์ด์ ?
- ํ์ ์ฒดํฌ๋ฅผ ํ ๋, ๊ทธ ๊ฐ์ด ๊ฐ์ง ํํ์ ์ง์คํ๊ธฐ ๋๋ฌธ
- One of TypeScript's core principles in that type checking focuses on the shape that values have. This is sometimes called "duck typing" or "structural subtyping".
- Exact ํ์ ์ด ์๊ธธ ์๋~?
ํ์ ์คํฌ๋ฆฝํธ ์ ํ ๊ฐ์ด๋
- tsconfig.json
{
"compilerOptions": {
"outDir": "./dist",
"allowJs": true,
"target": "es5"
},
"include": ["./src/**/*"]
}
2.1 JSX
- ํธ๋์คํ์ผ๋ฌ๋ฅผ ๊ฑฐ์น์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋๋ ์ด์ > JS ํ์ค ์ฝ๋๊ฐ ์๋
- ๋ชฉ์ : (1) HTML, XML์ JS ๋ด๋ถ์ ํํ (2) ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ ํฐํ -(ํธ๋์คํ์ผ)-> ECMAScript๋ก ๋ณํ
- XML๊ณผ ๋น์ทํ๊ฒ ๋ณด์ด๋ ์ด์ ? JS ๊ฐ๋ฐ์๊ฐ ์น์ํ๊ฒ ๋๋ผ๊ธฐ ์ํด
- JS ๋ด๋ถ์์ ํํํ๊ธฐ ๊น๋ค๋ก์ ๋ XML ์คํ์ผ์ ํธ๋ฆฌ ๊ตฌ๋ฌธ ์์ฑ์ ๋์
์ ์
JSXElement, JSXAttribute, JSXChildren, JSXString
โท JSXElement
- JSXOpeningElement, JSXClosingElement, JSXAttributes, JSXSelfClosingElement
<JSXOpeningElement JSXAttributes(optional)>
</JSXClosingElement>
<JSXSelfClosingElement JSXAttributes(optional) />
<></>
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ํ์ค์นผ๋ก ๋ง๋ค์ด์ผ ํ๋ ์ด์ ?
- React์์ HTML ํ๊ทธ๋ช ๊ณผ ์ฌ์ฉ์๊ฐ ๋ง๋ ํ๊ทธ๋ช ์ ๊ตฌ๋ถ์ง์ผ๋ ค๊ณ ํ ๊ฒ
JSXElementName
- JSXIdentifier, JSXNamespacedName, JSXMemberExpression
JSXMemberExpression
| ํน์ง | ์ค๋ช | | ------ | ----------------------------------------------------------------------------------------------- | | ์ญํ | ๊ฐ์ฒด์ ์์ฑ์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉ๋จ | | ํ๊ธฐ๋ฒ | ๊ฐ์ฒด์ ์์ฑ ์ฌ์ด์ ์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉ (์: object.property) | | ์์ | <Component.foo />์์ Component๋ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๊ณ , foo๋ ํด๋น ๊ฐ์ฒด์ ์์ฑ์ ๋ํ๋ | | ์์ | https://codesandbox.io/p/sandbox/mordern-react-deep-dive-t9vlwm?file=%2Fsrc%2FApp.tsx%3A25%2C18 | | ํน์ง | n๊ฐ ๋ฌถ์ ์ ์์ผ๋ => JSXNamespacedName์ ์ด์ด์๋ x |
JSXIdentifier
| ํน์ง | ์ค๋ช | | ------ | ----------------------------------------------------------------------------------------------------- | | ์ญํ | ์์ ์ด๋ฆ์ด๋ ์์ฑ ์ด๋ฆ์ ๋ํ๋ | | ํ๊ธฐ๋ฒ | ์ผ๋ฐ์ ์ผ๋ก ํ๊ทธ ์ด๋ฆ์ด๋ ์์ฑ ์ด๋ฆ์ ๋ํ๋ด๋ฉฐ, ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์์ | | ์์ | ์์ div๋ ์์์ ์ด๋ฆ์ ๋ํ๋ | | ํน์ง | ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ณ์์ ๋์ผํ๊ฒ (1)$, _ ์ธ์ ๋ค๋ฅธ ํน๋ฌธ์ผ๋ก ์์ํ ์ ์์ (2) ์ซ์๋ก ์์ํ ์ ์์ |
JSXNamespacedName
| ํน์ง | ์ค๋ช | | ------ | ---------------------------------------------------------------------------------------- | | ์ญํ | XML ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฅผ ์ ์ํจ ex) RSS, SVG | | ํ๊ธฐ๋ฒ | ๋ค์์คํ์ด์ค์ ์์ ์ด๋ฆ ์ฌ์ด์ ์ฝ๋ก (:)์ ์ฌ์ฉํ์ฌ ๊ตฌ๋ถํจ | | ์์ | <svg:rect />์์ svg๋ ๋ค์์คํ์ด์ค๋ฅผ ๋ํ๋ด๊ณ , rect๋ ์์์ ์ด๋ฆ์ ๋ํ๋ (XML ๋ค์์ค) | | ํน์ง | 2๊ฐ ์ด์์ ์ฌ๋ฐ๋ฅธ ์๋ณ์๋ก ์ทจ๊ธ๋์ง ์์ |
โท JSXAttributes
(optional) JSXSpreadAttribute, JSXAttribute
- JSXSpreadAttribute: ์ ๊ฐ ์ฐ์ฐ์, {...AssignmentExpression}
- JSXAttribute: ํค ๊ฐ ์, {JSXAttributeName: JSXAttributeValue}
- JSXAttributeValue: "๋ฌธ์์ด", '๋ฌธ์์ด', {AssignmentExpression}, JSXElement
โท JSXChildren
JSXChild
- JSXChild: JSXChildren์ JSXChild๋ฅผ 0๊ฐ ์ด์ ๊ฐ์ง
- JSXText: {, }, <, > ์ ์ธ
- JSXElement
- JSXFragment
- { JSXChildExpression (optional) }
<>{(() => "๐")()}</>
โท JSXString
const message = "This is a \"quoted\" string"
english
structural subtyping: ๊ตฌ์กฐ์ ์๋ธํ์ดํ