Python 프로그래머를 위한 TypeScript에 대한 간단한 소개


작성자별 이미지
# 소개
당신은 한동안 Python으로 코딩을 해왔고, 그것을 정말 좋아하며, 아마도 자면서도 데코레이터를 작성할 수 있을 것입니다. 하지만 머릿속에는 TypeScript를 배워야 한다고 잔소리하는 목소리가 있습니다. 어쩌면 풀 스택 역할을 위한 것일 수도 있고 대규모 코드베이스에 Python이 “완전히 괜찮은” 이유를 설명하는 데 지쳤을 수도 있습니다.
문제는 다음과 같습니다. TypeScript는 단순한 “유형이 있는 JavaScript”가 아닙니다. JavaScript는 처음부터 그랬어야 했습니다. 그리고 Python 출신이라면 이미 생각보다 더 많은 것을 이해하고 있을 것입니다.
# Python에서 TypeScript로 이동
Python은 덕 타이핑과 동적 유연성을 제공합니다. TypeScript는 안전망을 통해 동일한 유연성을 제공합니다. 다음과 같이 생각해보세요. 파이썬의 mypy mypy가 실제로 모든 곳에서 작동한다면요.
Python에서는 모든 객체에 대해 어떤 메서드든 호출할 수 있으며 그것이 작동하기를 “희망”합니다. TypeScript는 컴파일 타임에 작동 여부를 알려줍니다. "AttributeError: 'NoneType' object has no attribute 'name'"
순간.
# Python: You hope this works
def process_user(user):
return user.name.upper()
// TypeScript: You know this works
function processUser(user: User): string {
return user.name.toUpperCase();
}
만약에 user
가 없습니다 name
속성이 있으면 TypeScript는 코드가 실행되기 전에 이를 포착합니다. 그러니까 방어가 필요없어 if hasattr(obj, 'attribute')
여기저기서 확인합니다.
# 타입스크립트 기초
TypeScript의 기본부터 시작해 보겠습니다.
// 변수 및 기본 유형
Python의 유형 힌트는 선택적 제안입니다. TypeScript의 유형은 강제 계약과 유사합니다. 좋은 소식이요? TypeScript는 대부분의 유형을 자동으로 추론할 수 있으므로 모든 항목에 주석을 달 필요가 없습니다.
# Python
name = "Alice"
age = 30
is_active = True
scores = [95, 87, 92]
user = {"name": "Bob", "age": 25}
// TypeScript
const name = "Alice"; // string (inferred)
const age = 30; // number (inferred)
const isActive = true; // boolean (inferred)
const scores = [95, 87, 92]; // number[] (inferred)
const user = { name: "Bob", age: 25 }; // object (inferred)
// Or be explicit
const name: string = "Alice";
const scores: number[] = [95, 87, 92];
추론이 명확하지 않거나 의도를 더욱 명확하게 하려는 경우에만 명시적인 주석이 필요합니다.
// 기능
함수 구문은 거의 직접적으로 매핑되지만 기본 매개변수에 대한 TypeScript의 접근 방식은 Python의 변경 가능한 기본 인수 문제보다 더 깔끔합니다.
# Python
def greet(name: str, excited: bool = False) -> str:
suffix = "!" if excited else "."
return f"Hello, {name}{suffix}"
// TypeScript
function greet(name: string, excited = false): string {
const suffix = excited ? "!" : ".";
return `Hello, ${name}${suffix}`;
}
// Or arrow function (Python lambda equivalent)
const greet = (name: string, excited = false): string =>
`Hello, ${name}${excited ? "!" : "."}`;
화살표 함수 구문은 Python의 람다와 유사하지만 더 강력합니다. 완전한 기능의 본문을 작성할 수도 있고 간결한 한 줄짜리 본문을 작성할 수도 있습니다. 템플릿 리터럴(백틱)은 다음과 같이 작동합니다. Python의 f-문자열.
// 수업
TypeScript 클래스는 Python 클래스보다 더 간소화된 느낌을 줍니다. 더 이상은 안돼 self
생성자 매개변수는 자동으로 속성이 될 수 있습니다.
# Python
class User:
def __init__(self, name: str, email: str):
self.name = name
self.email = email
def greet(self) -> str:
return f"Hi, I'm {self.name}"
// TypeScript
class User {
constructor(public name: string, public email: string) {}
greet(): string {
return `Hi, I'm ${this.name}`;
}
}
저것 public
생성자의 키워드는 “이 속성을 자동으로 생성하고 여기에 매개변수 값을 할당합니다”에 대한 TypeScript의 약어입니다. 따라서 다음을 사용할 필요가 없습니다. self.name = name
상용구. 당신은 또한 사용할 수 있습니다 private
또는 protected
캡슐화를 위해.
# TypeScript가 흥미로운 곳
이것이 기본을 넘어서면서 TypeScript가 흥미로워지기 시작하는 지점입니다.
// 공용체 유형(Python의 Union
하지만 더 좋음)
타이핑 모듈의 Python Union 유형은 작동하지만 때로는 장황합니다. TypeScript의 공용체 유형은 언어에 내장되어 있습니다.
# Python
from typing import Union
def process_id(user_id: Union[str, int]) -> str:
return str(user_id)
// TypeScript
function processId(userId: string | number): string {
return userId.toString();
}
그만큼 |
구문이 다음보다 깨끗합니다. Union[str, int]
TypeScript의 컴파일러는 보다 정교한 유형 검사를 수행할 수 있습니다. 런타임 시 특정 유형에 따라 어떤 메서드를 사용할 수 있는지 알고 있습니다.
// 리터럴 유형
Python의 리터럴 유형은 비교적 새롭지만 유용합니다. 그러나 TypeScript에는 훨씬 더 효과적인 리터럴 유형이 있습니다.
# Python
from typing import Literal
Status = Literal["pending", "approved", "rejected"]
def update_status(status: Status) -> None:
print(f"Status: {status}")
// TypeScript
type Status = "pending" | "approved" | "rejected";
function updateStatus(status: Status): void {
console.log(`Status: ${status}`);
}
“maybe”와 같은 잘못된 문자열을 전달해 보세요. updateStatus
TypeScript는 컴파일을 거부합니다. 편집자는 유효한 옵션에 대해 자동 완성 기능도 제공합니다. 실제로 유용한 열거형을 갖는 것과 같습니다.
// 인터페이스
Python의 데이터 클래스는 구조화된 데이터를 생성하는 데 적합합니다.
# Python
from dataclasses import dataclass
@dataclass
class User:
name: str
email: str
age: int
그러나 TypeScript의 인터페이스는 더 유연합니다. 특정 클래스 구현을 생성하지 않고 데이터를 설명합니다.
// TypeScript
interface User {
name: string;
email: string;
age: number;
}
// Use it anywhere
const user: User = { name: "Alice", email: "[email protected]", age: 30 };
올바른 속성을 가진 모든 개체는 자동으로 인터페이스를 충족합니다. 상속이 필요하지 않으며 명시적인 클래스 인스턴스화가 필요하지 않습니다. 컴파일 타임 검증을 통한 덕 타이핑입니다.
# 더 많은 TypeScript 기능 알아보기
이제 TypeScript의 몇 가지 유용한 기능을 더 배워보겠습니다.
// 제네릭(Python과 마찬가지로 TypeVar
)
Python의 일반 타이핑은 작동하지만 투박합니다. TypeScript 제네릭은 기본적으로 자연스럽고 강력한 느낌을 줍니다.
# Python
from typing import TypeVar, List
T = TypeVar('T')
def first(items: List[T]) -> T:
return items[0]
// TypeScript
function first(items: T[]): T {
return items[0];
}
// Works with anything
const firstNumber = first([1, 2, 3]); // number
const firstString = first(["a", "b", "c"]); // string
TypeScript는 사용법에서 일반 유형을 자동으로 추론합니다. 부르다 first
숫자를 사용하면 숫자를 반환합니다. 문자열로 호출하면 문자열을 반환합니다. 명시적인 유형 매개변수는 필요하지 않지만 추론이 명확하지 않은 경우 제공할 수 있습니다.
// 유형 가드
유형 가드를 사용하면 컴파일러가 후속 코드에서 유형을 좁히기 위해 이해하고 사용하는 런타임 검사를 작성할 수 있습니다.
function isString(value: unknown): value is string {
return typeof value === "string";
}
function processValue(value: string | number) {
if (isString(value)) {
return value.toUpperCase();
}
return value.toFixed(2);
}
그만큼 value is string
구문은 이 함수가 true를 반환하면 매개 변수가 확실히 문자열임을 TypeScript에 알려줍니다. if 블록 내에서는 전체 문자열 메서드와 속성을 얻을 수 있습니다. 캐스팅도 없고 어설션도 없으며 런타임 검사를 기반으로 스마트 유형 축소만 수행됩니다.
// 매핑된 유형(유형에 대한 목록 이해)
매핑된 유형을 목록 이해로 생각하지만 유형 변환의 경우입니다. 기존 유형을 변환하여 새로운 유형을 만들 수 있습니다.
type User = {
name: string;
email: string;
age: number;
};
// Make all properties optional
type PartialUser = Partial;
// Make all properties readonly
type ReadonlyUser = Readonly;
// Pick specific properties
type UserContact = Pick;
이러한 유틸리티 유형은 TypeScript와 함께 제공되며 일반적인 패턴을 해결합니다. User와 비슷하지만 업데이트를 위한 선택적 필드가 있는 유형이 필요한 경우 다음을 사용할 수 있습니다. Partial
. 생성 후 수정이 없도록 해야 하는 경우 다음을 사용하세요. Readonly
.
# TypeScript의 오류 처리
Python 개발자는 try/제외 블록을 좋아하지만 장황해질 수 있습니다. TypeScript는 함수 시그니처에서 오류를 명시적으로 만드는 오류 처리를 위해 결과 유형과 공용체 유형을 사용하는 다른 접근 방식을 사용합니다.
// Result type pattern (inspired by Rust)
type Result = { success: true; data: T } | { success: false; error: E };
// Make this file a module
export {};
// Assuming you have a User type and parseUser function
interface User {
name: string;
// ... other properties
}
function parseUser(data: unknown): User {
// Your parsing logic here
// This should throw an error if parsing fails
if (!data || typeof data !== 'object') {
throw new Error('Invalid user data');
}
const user = data as any;
if (!user.name || typeof user.name !== 'string') {
throw new Error('User name is required and must be a string');
}
return { name: user.name };
}
async function safeParseUser(data: unknown): Promise> {
try {
const user = parseUser(data);
return { success: true, data: user };
} catch (error) {
// Fix: Handle the case where error might not have a message property
const errorMessage = error instanceof Error ? error.message : String(error);
return { success: false, error: errorMessage };
}
}
다음과 같이 사용할 수 있습니다.
// Usage (wrapped in an async function or use at top level in a module)
async function example() {
const rawData = { name: "John Doe" }; // Example data
const result = await safeParseUser(rawData);
if (result.success) {
console.log(result.data.name); // TypeScript knows this is User
} else {
console.error(result.error); // TypeScript knows this is string
}
}
// Call the example function
example();
이 패턴은 유형 시스템에서 오류를 명시적으로 만듭니다. 눈에 띄지 않게 날아다니는 예외 대신 오류가 반환 유형의 일부가 됩니다. 그만큼 Result
유형을 사용하면 성공 사례와 실패 사례를 모두 처리해야 합니다. TypeScript의 구별된 공용체는 이 패턴을 간단하게 만듭니다. 성공 속성은 현재 공용체의 어느 분기에 있는지 알려주므로 데이터 또는 오류가 사용 가능한지 여부를 알 수 있습니다.
# 결론
TypeScript는 웹 개발, 대규모 애플리케이션 및 강력한 API가 필요한 모든 곳에서 매우 인기를 얻고 있습니다.
전환은 새로운 언어를 배우는 것이 아닙니다. 좋은 소프트웨어 디자인에 대해 알고 있는 모든 것을 다른 생태계에 적용하는 것이 더 중요합니다. 깔끔한 코드, 읽기 쉬운 API 및 사려 깊은 추상화에 대한 Python 직관이 직접적으로 해석됩니다.
VS Code를 열고 .ts
파일을 저장하고 코딩을 시작하세요. 일어나는 최악의 상황은 무엇입니까? 당신은 새로운 것을 배웁니다. 가장 좋은 점은? 당신이 좋아하는 새로운 언어를 찾을 수도 있습니다. 즐거운 코딩하세요!
발라 프리야 C 인도 출신의 개발자이자 기술 작가입니다. 그녀는 수학, 프로그래밍, 데이터 과학, 콘텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 분야와 전문 분야에는 DevOps, 데이터 과학, 자연어 처리가 포함됩니다. 그녀는 읽기, 쓰기, 코딩, 커피를 즐깁니다! 현재 그녀는 튜토리얼, 방법 가이드, 의견 등을 작성하여 개발자 커뮤니티에서 자신의 지식을 학습하고 공유하는 데 힘쓰고 있습니다. Bala는 또한 매력적인 리소스 개요와 코딩 튜토리얼을 만듭니다.
Post Comment