공식문서 - https://www.typescriptlang.org/
TypeScript
TypeScript is JavaScript with syntax for types
: 타입 구문이 있는 JavaScript
- TS가 컴파일되면 JavaScript로 변환됨 (브라우저, Node.js 등)
- 타입 추론, 타입 명시 가능
JS코드에서 TS 보호받기 가능
@ts-check
- 주석으로 넣으면 TS처럼 타입,에러 체크 가능// @ts-check
/**
*
* @param
* @returns
*/
js코드 작성
변수명 : type명
const 변수명 :string = 'mun'
변수명 = 119; //타입이 변경되면 에러메시지 출력해줘서 버그 줄일수있음
|
로 여러타입 지정 가능let 변수명 :string | number = 'mun';
let 숫자 : string[] = ['one', 'two'];
let 나이 : {age : number} = {age : 1}
type
키워드로 변수처럼 사용 가능type nameType = string | number;
let 이름 : nameType = 'kim';
function 함수명(a :string) : string{
return '안녕';
}
//에러
function 함수명(x :number | string) {
return x * 2
}
//가능
function 함수명(x :number | string) {
if (typeof x === 'number'){
return x * 2
}
}
type Info = [number, boolean];
let mun:Info = [100, false]
참고 - Type Aliases와 Interfaces의 차이점
type
키워드나 interface
키워드로 객체 타입 지정 가능속성명?
사용 가능interface UserInfo1 {
name : string,
age : number
}
type UserInfo2 = {
name? : string, //속성이 필수가 아니고 선택적일때 ? 사용
age : number
}
let 회원명 :UserInfo1 = {
name : 'mun',
age : 30
}
type UserInfo = {
[key :string] : number,
}
let 철수 :UserInfo = {
age : 30,
weight : 80,
}
/*확장*/
//People.tsx
export interface PeopleInterface {
name: string
age: number
}
interface StudentInterface extends PeopleInterface {
school: string
}
/*외부 컴포넌트 사용*/
import PeopleInterface from "People.tsx";
const cmp:React.FC=()=>{
const [people, setPeople]=useState<PeopleInterface>();
}
type Player = {
readonly name:string; // 읽기전용, 수정불가
age?:number
}
// 함수선언식
function Maker(name:string) : Player{
return {
name:name
}
}
// 화살표함수
const Maker = (name:string): Player => ({name})
const nico = Maker("nico")
nico.age = 12
const numbers: readonly number[] = [1,2,3,4]
Array에 타입을 작성하는 방법
number[]
하거나 Array<number>
// Array<number> 제네릭 사용
let arr: Array<number> = [1, 2, 3, 4];
// 또 다른 사용 방법
let arr: number[] = [1, 2, 3, 4];
// Tuple
const member: [string, number, boolean] = ["ho", 1, true]
// readonly + Tuple
const member: readonly [string, number, boolean] = ["ho", 1, true]
function hi(): void {
console.log('리턴 안함')
}
let a: unknown;
if(typeof a === 'number'){
let result = a * 10
}
function hey(): never {
throw new Error("never again")
}
// 타입이 2가지일 수 있는 상황에서 발생가능
function hello(name:string|number) {
if(typeof name === 'string'){
name
} else if (typeof name === 'number'){
name
} else {
name // 여기서 name 타입은 never가 된다.
}
}
IDE에서 함수 위에 마우스 호버 시 함수 반환 타입이 나오는 것
functions add(a:number, b:number){
return a+b
}
const add = (a:number, b:number) => a+b
// 함수의 call signatures 타입 선언
type Add = (a:number, b:number) => number;
const add: Add = (a,b) => a+b
함수가 서로다른 여러 call signatures를 가질 때 발생함
// parameter 개수가 다른 경우
type Add = {
(a:number, b:number) : number
(a:number, b:number, c:number) : number // c는 추가옵션
}
const add:Add = (a,b,c?:number) => {
if(c) return a+b+c
return a+b
}
const add: Add = (a,b) => {
if(typeof b === "string") return a
return a+b
}
type Config = {
path: string,
state: object
}
type Push = {
(path:string):void
():void
}
const push :Push = (config) = {
if(typeof config === "string") {console.log(config)}
else {console.log(config.path, config.state}
}