타입스크립트
[JS] 자바스크립트 코드 최적화 기법 모음
[JS] 자바스크립트 코드 최적화 기법 모음
2024.12.07"Optimizing Javascript for fun and for profit"라는 자바스크립트 최적화 관련 글의 영어 원문과 번역본을 바탕으로, 부가적인 설명을 추가하고 이해하기 쉬운 언어로 정리해 봤다. 예시 코드도 조금 더 다듬어서 개선했다. 문자열 비교 피하기 Avoid string comparisons문자열 비교는 각 문자를 순차적으로 비교해야 하므로 O(n) 시간복잡도를 갖는다. 특히 문자열 enum을 사용하는 것은 성능 최적화 관점에서 피해야 할 패턴 중 하나다. 자바스크립트 엔진에서 정수(Integer)는 일반적으로 값으로 전달되며, 비교 연산 시 바로 값을 확인할 수 있어 빠르게 처리할 수 있다. 반면 문자열은 메모리에 저장된 위치(포인터)를 참조해 값을 가져온 후 비교하기 때문에 ..
[React] 리액트 코드를 개선할 수 있는 4가지 팁
[React] 리액트 코드를 개선할 수 있는 4가지 팁
2024.10.28TLDR이벤트 핸들러에 커링 활용컴포넌트 책임 분리조건문 대신 객체 map 사용React 라이프사이클 외부에 독립적인 변수 배치 4 React Tips1. 커링 활용user 상태는 name, surname, address 3개 속성을 가지며, 이에 대응하는 3개의 input 필드가 필요하다. 아래 코드에선 각 필드를 처리하기 위해 별도의 핸들러를 각각 만들어서 사용하고 있지만, 이 핸들러들은 value가 할달될 속성 이름만 다를 뿐 나머지 로직이 동일하기 때문에 코드 중복이 발생하고 있다.export default function App() { const [user, setUser] = useState({ name: "", surname: "", address: "", }); co..
[TS] 타입스크립트 브랜디드 타입
[TS] 타입스크립트 브랜디드 타입
2024.09.26Branded Type타입스크립트를 사용하다 보면 서로 다른 두 객체의 특정 속성이 동일한 타입을 가질 때가 많다. 이로 인해 타입 시스템에서 오류가 발생하지 않더라도 논리적 오류나 타입 안전성 문제를 야기할 수 있다.type User = { id: string; name: string;};type Post = { id: string; ownerId: string; comments: Comments[];};type Comments = { id: string; timestamp: string; body: string; authorId: string;}; 위 예시에서 User.id, Post.id, Comments.id는 모두 string 타입이다. 첫 번째 인자 postId, 두 번째 인자..
[Dart] 자바스크립트 개발자의 다트 학습 - Part 2
[Dart] 자바스크립트 개발자의 다트 학습 - Part 2
2024.08.21Dart와 JavaScript는 많은 개념을 공유한다. Dart 역시 이벤트 루프에서 실행되고, 비동기 프로그래밍을 위한 Future라는 개념이 존재한다. Future는 자바스크립트의 Promise와 비슷하다. Dart는 정적 타입 언어이기 때문에 타입스크립트를 사용한 경험이 있다면 Dart를 더 쉽게 배울 수 있다. Dart와 JavaScript의 다른 점과 비슷한 점을 Learning Dart as a JavaScript developer 페이지에 자세히 설명돼 있어서 정리해봤다. 💡 아래는 Part 1에서 이어지는 Part 2 내용. Asynchrony자바스크립트와 마찬가지로 Dart 가상머신(VM)은 단일 이벤트 루프를 사용하여 코드를 실행한다. 모든 코드는 동기적으로 실행되지만, 비동기 도구..
[Dart] 자바스크립트 개발자의 다트 학습 - Part 1
[Dart] 자바스크립트 개발자의 다트 학습 - Part 1
2024.08.21Dart와 JavaScript는 많은 개념을 공유한다. Dart 역시 이벤트 루프에서 실행되고, 비동기 프로그래밍을 위한 Future라는 개념이 존재한다. Future는 자바스크립트의 Promise와 비슷하다. Dart는 정적 타입 언어이기 때문에 타입스크립트를 사용한 경험이 있다면 Dart를 더 쉽게 배울 수 있다. Dart와 JavaScript의 다른 점과 비슷한 점을 Learning Dart as a JavaScript developer 페이지에 자세히 설명돼 있어서 정리해봤다. Conventions and lintingDart 팀에서 공식적으로 코드 스타일 가이드와 Lint 도구를 제공한다.dart fix를 통해 코드 이슈를 발견하고 수정할 수 있다.dart format을 통해 코드를 포매팅할 ..
[TS] 타입스크립트 클래스(class) 문법, 추상 클래스와 메서드
[TS] 타입스크립트 클래스(class) 문법, 추상 클래스와 메서드
2024.05.29클래스 정의자바스크립트에선 생성자 내부에서 프로퍼티를 선언하고 초기화한다. 클래스 필드를 사용하는 경우를 제외하곤 클래스 바디에 프로퍼티를 따로 선언할 필요가 없다. 반면 타입스크립트에선 먼저 클래스 바디에 프로퍼티를 미리 선언하고 타입을 지정해야 한다. 클래스 바디에 프로퍼티를 선언하지 않으면 에러가 발생한다.class User { name: string; // 프로퍼티 선언 및 타입 지정 constructor(name: string) { this.name = name; // 프로퍼티 초기화 }}const user = new User('John');console.log(user); // { name: 'John' } 타입스크립트에선 public, protected, private 접근 제한자..
[TS] 타입스크립트 구조적 타이핑 활용하기
[TS] 타입스크립트 구조적 타이핑 활용하기
2024.05.25Object.keys 메서드의 타입 정의타입스크립트를 사용하다 보면 아래 같은 상황을 자주 마주한다. Object.keys() 메서드를 사용해서 객체의 키를 배열로 추출한 후, 해당 키를 이용해 객체에 접근할 때 에러가 발생한다.type Options = { host: string; port: number };const validateOptions = (options: Options) => { const keys = Object.keys(options); // string[] keys.forEach((key) => { // Error! 'Options' 형식에서 'string' 형식의 매개 변수가 포함된 인덱스 시그니처를 찾을 수 없습니다. if (options[key] === null) ..
[TS] TypeScript 타입스크립트 Infer 키워드 활용하기
[TS] TypeScript 타입스크립트 Infer 키워드 활용하기
2024.05.19타입스크립트 infer는 타입을 추론하는데 사용하는 키워드다. 배열 요소 타입, 함수 파라미터 타입, 함수 반환 타입 등 특정 문맥의 타입 추출이 필요할 때 infer를 활용할 수 있다.기본 문법 : T extends infer U ? U : T — U가 추론 가능한 타입이면 U 리턴, 아니면 T 리턴 infer는 타입 구현 영역(할당 연산자 우측)의 조건부 타입(extends 절)에서만 사용할 수 있으며, TS 엔진이 타입을 추론하고 변수(제네릭 타입)에 할당한다. 할당된 변수는 조건부 타입의 true 분기에서만 사용할 수 있다.// Error! 'infer' declarations are only permitted in the 'extends' clause of a conditional type.(t..
[TS] 타입스크립트의 공변성 / 반공변성 / 이변성
[TS] 타입스크립트의 공변성 / 반공변성 / 이변성
2024.05.17TL;DR 엄격 모드비엄격 모드함수 리턴 타입공변적공변적함수 파라미터 타입반공변적이변적그 외공변적공변적공변성 : 슈퍼 타입(넓은 타입)이 서브 타입(좁은 타입)을 커버하는 관계서브 타입을 슈퍼 타입에 대입할 수 있음 e.g. superType = subType타입스크립트 기본 동작반공변성 : 서브 타입(좁은 타입)이 슈퍼 타입(넓은 타입)을 커버하는 관계슈퍼 타입을 서브 타입에 대입할 수 있음 e.g. subType = superType함수 파라미터 동작이변성 : 공변성과 반공변성을 모두 포함하는 관계슈퍼 타입과 서브 타입을 모두 대입할 수 있음strictFunctionTypes 옵션을 껐을 때 함수 파라미터 동작 공변성 | Covariance공변성 : A가 B의 서브 타입이면, T는 T의 서브 타입 아..
[TS] TypeScript 타입스크립트 satisfies 연산자
[TS] TypeScript 타입스크립트 satisfies 연산자
2024.05.16타입스크립트 4.9 버전부터 안전한 *업캐스팅을 지원하는 satisfies 연산자를 사용할 수 있다. satisfies 연산자를 활용하면 타입을 변경하지 않고도 변수에 *제약 조건(constraint)을 적용할 수 있다. 즉, 객체 프로퍼티에 제약 조건을 적용하면서 각 프로퍼티의 타입을 올바르게 추론할 수 있다. 💡 용어 설명캐스팅 : 타입 변환업캐스팅 : 자식 클래스를 부모 클래스 타입으로 캐스팅 (상위 타입으로 변환)다운캐스팅 : 부모 클래스를 자식 클래스 타입으로 캐스팅 (하위 타입으로 변환)제약 조건 : 특정 타입이나 구조를 강제하여 코드의 안정성과 일관성을 보장하는 방법 문제아래 참가자 정보를 나타내는 attendee 객체가 있다. 객체를 선언하면 타입스크립트는 객체의 각 프로퍼티 타입을 자동..
[TS] 엘리먼트의 기본 어트리뷰트 인터페이스/타입 사용하기
[TS] 엘리먼트의 기본 어트리뷰트 인터페이스/타입 사용하기
2024.05.12HTMLAttributescheckbox 타입의 엘리먼트를 사용하는 Toggle 컴포넌트를 만든다고 가정해보자. 엘리먼트는 autoFocus, required, readOnly 등의 기본 어트리뷰트 가진다. 만약 엘리먼트가 기본적으로 받을 수 있는 어트리뷰트를 Toggle 컴포넌트의 props로 넘기고 싶다면? 모든 어트리뷰트에 대한 인터페이스를 정의해야 할까? 이땐 InputHTMLAttributes 타입을 사용하면 된다. 그럼 각 어트리뷰트의 prop 타입을 일일이 정의하지 않아도 된다. 제네릭 T는 onChange 이벤트 핸들러의 엘리먼트 타입이 들어가므로 HTMLInputElement 같은 타입을 넘기면 된다.// InputHTMLAttributes 구조 | node_modules/@types/r..
[TS] useQuery, useMutation의 제네릭 타입 살펴보기 / Base Query 훅 만들기
[TS] useQuery, useMutation의 제네릭 타입 살펴보기 / Base Query 훅 만들기
2024.05.12React Query에서 제공하는 useQuery, useMutation을 그대로 사용하면 항상 쿼리키와 쿼리 함수를 지정해야 하는 번거로움이 있다. API 유형에 따라 Base Query|Mutation 커스텀 훅을 만들어 두고 사용하면 쿼리키와 쿼리 함수를 일일이 지정하지 않고 여러 곳에서 재사용하기 좋다. 하지만 커스텀 훅을 만들 때 쿼리 타입을 지정하지 않으면 데이터가 unknown, any인 경우가 많아서 어떤 데이터를 다루는지 알기 어렵다. 쿼리 타입은 대부분 제네릭으로 되어 있는데 이를 잘 사용하면 타입을 보장 받으면서 데이터를 편리하게 다룰 수 있다. useQuery제네릭 타입 톺아보기 ⚡️export declare function useQuery ❶ TQueryFnData : 쿼리 함수 ..