// JavaScript const message = 'hi'; function sum(a, b) { return a + b; }
// JavaScript const message = 'hi'; function sum(a, b) { return a + b; }
// TypeScript const message: string = 'hi'; function sum(a: number, b: number): number { return a + b; }
// TypeScript const message: string = 'hi'; function sum(a: number, b: number): number { return a + b; }
리액트에서 컴포넌트를 정의하는 방법
// App.tsx function App(): JSX.Element { return ( <div>Hi React</div> ); }
// App.tsx function App(): JSX.Element { return ( <div>Hi React</div> ); }
function sum(a: number, b: number): number { return a + b; }
function sum(a: number, b: number): number { return a + b; }
TIP! 타입 표기(Type Annotation) - 타입을 정의하는 방식 :number
:string
리액트에서 상태를 정의하는 방법
function App() { const [counter, setCounter] = useState(0); return ( <div>{counter}</div> ); }
function App() { const [counter, setCounter] = useState(0); return ( <div>{counter}</div> ); }
const a: string = 'hi';
const num: number = 10;
const isLogin: boolean = true;
const arr: number[] = [1,2,3];
const product: object = { name: 'Shoes' };
const result: any = 10 + {} + [];
리액트에서 UI 이벤트를 제어하는 방법
import { MouseEvent } from 'react'; function App() { const showAlert = (event: MouseEvent<HTMLButtonElement>) => { console.log(event); }; return ( <button onClick={showAlert}>show</button> ) }
import { MouseEvent } from 'react'; function App() { const showAlert = (event: MouseEvent<HTMLButtonElement>) => { console.log(event); }; return ( <button onClick={showAlert}>show</button> ) }
import { ChangeEvent, useState } from 'react'; function App() { const [todo, setTodo] = useState(''); function updateTodo(event: ChangeEvent<HTMLInputElement>) { setTodo(event.target.value); } return ( <input type="text" value={todo} onChange={updateTodo} /> ) }
import { ChangeEvent, useState } from 'react'; function App() { const [todo, setTodo] = useState(''); function updateTodo(event: ChangeEvent<HTMLInputElement>) { setTodo(event.target.value); } return ( <input type="text" value={todo} onChange={updateTodo} /> ) }
타입을 함수의 파라미터처럼 사용하는 문법. 타입을 넘겨 타입을 받는다.
function getText<T>(text: T) { return text; } const message = getText<string>('hi'); const userId = getText<number>(10);
function getText<T>(text: T) { return text; } const message = getText<string>('hi'); const userId = getText<number>(10);
타입 간의 호환 여부. 변수에 특정 값을 할당할 수 있는지의 관점
let a: number = 10; let b: string = 'hi'; b = a; // 에러 발생. 호환되지 않음
let a: number = 10; let b: string = 'hi'; b = a; // 에러 발생. 호환되지 않음
let a: number = 10; let b: any = 'hi'; b = a; // 에러 발생 안함. 호환됨
let a: number = 10; let b: any = 'hi'; b = a; // 에러 발생 안함. 호환됨
|
), 인터섹션(&
) 타입을 사용했을 때의 호환성리액트에서 프롭스(Props) 속성을 정의하는 방법
interface AppHeaderProps { headerTitle: string; } type AppHeaderProps = { headerTitle: string; } function AppHeader(props: AppHeaderProps) { return ( <h1>{props.headerTitle}</h1> ); }
interface AppHeaderProps { headerTitle: string; } type AppHeaderProps = { headerTitle: string; } function AppHeader(props: AppHeaderProps) { return ( <h1>{props.headerTitle}</h1> ); }
객체 모양의 타입을 정의할 때 유용한 문법. 프레임워크에서는 주로 API 응답, 프롭스, 변수, 함수를 정의할 때 자주 사용.
interface Person { name: string; age: number; } const vision: Person = { name: '비전', age: 3 };
interface Person { name: string; age: number; } const vision: Person = { name: '비전', age: 3 };
타입에 의미를 부여할 수 있는 문법. 타입의 변수화. 하지만 재선언은 불가.
// 기본 타입으로 선언한 경우 const a: string = 'Josh'; // 타입 별칭으로 선언한 경우 type MyName = string; const a: MyName = 'Josh';
// 기본 타입으로 선언한 경우 const a: string = 'Josh'; // 타입 별칭으로 선언한 경우 type MyName = string; const a: MyName = 'Josh';
뷰에서 데이터 속성을 정의하는 방법
<script lang="ts"> export default defineComponent({ data() { return { message: 0, }; }, }); </script> <template> <p>{{ message }}</p> </template>
<script lang="ts"> export default defineComponent({ data() { return { message: 0, }; }, }); </script> <template> <p>{{ message }}</p> </template>
타입스크립트 컴파일러가 작성된 타입 코드를 해석하는 동작.
// 타입 표기 방식으로 타입을 선언한 코드 const a: string = 'hi'; // 타입 추론에 기댄 코드 const a = 'hi';
// 타입 표기 방식으로 타입을 선언한 코드 const a: string = 'hi'; // 타입 추론에 기댄 코드 const a = 'hi';
TIP! 타입스크립트 컴파일러보다 타입을 더 잘 정의할 순 없다. 타입 추론에 의지해라.
뷰에서 UI 이벤트 핸들러를 정의하는 방법
<script lang="ts"> export default defineComponent({ methods: { showAlert(event: MouseEvent) { alert('hi'); }, }, }); </script> <template> <button @click="showAlert">show</button> </template>
<script lang="ts"> export default defineComponent({ methods: { showAlert(event: MouseEvent) { alert('hi'); }, }, }); </script> <template> <button @click="showAlert">show</button> </template>
자바스크립트 문법, 웹 API 등을 미리 선언해 둔 타입 모음
window.localStorage.setItem(); ['a','b'].splice();
window.localStorage.setItem(); ['a','b'].splice();
뷰에서 프롭스 속성을 정의하는 방법
<script lang="ts"> import { PropType, defineComponent } from "vue"; interface Profile { name: string; age: number; } export default defineComponent({ props: { userProfile: { type: Object as PropType<Profile> }, }, }); </script> <template> <p>{{ userProfile }}</p> </template>
<script lang="ts"> import { PropType, defineComponent } from "vue"; interface Profile { name: string; age: number; } export default defineComponent({ props: { userProfile: { type: Object as PropType<Profile> }, }, }); </script> <template> <p>{{ userProfile }}</p> </template>
타입스크립트 컴파일러를 속이는 방법. 내가 지정한 타입으로 타입 강제하기.
const a = 'hi' as any;
const a = 'hi' as any;
type Person = { name: string; age: number; } const b = {} as Person; b.name = 'Thor';
type Person = { name: string; age: number; } const b = {} as Person; b.name = 'Thor';
const apiUrl = 'https://jsonplaceholder.typicode.com/todos' interface Todo { userId: number id: number title: string completed: boolean } async function fetchTodos(): Promise<Todo[]> { const response = await fetch(apiUrl); const data = await response.json(); return data; } fetchTodos().then((todos) => todos[0].)
const apiUrl = 'https://jsonplaceholder.typicode.com/todos' interface Todo { userId: number id: number title: string completed: boolean } async function fetchTodos(): Promise<Todo[]> { const response = await fetch(apiUrl); const data = await response.json(); return data; } fetchTodos().then((todos) => todos[0].)
function fetchProduct() { // ... } const product = fetchProduct() as Product; product.getId(); // 에러 날 확률 높음
function fetchProduct() { // ... } const product = fetchProduct() as Product; product.getId(); // 에러 날 확률 높음
interface Developer { name: string; coding: () => void; } const capt = { name: '캡틴' } as Developer; capt.coding(); // 에러 발생
interface Developer { name: string; coding: () => void; } const capt = { name: '캡틴' } as Developer; capt.coding(); // 에러 발생
TIP! 타입 표기, 타입 호환, 타입 추론에 의지할 것