export default interface IPerson {
name: string,
age: number
}
import {makeRandomNumber} from '../utils/makeRandomNumber'
import IPerson from './IPerson'
export default class Person implements IPerson {
constructor(public name: string, public age: number = makeRandomNumber()) {}
}
export const makePerson = (name: string,
age:number = makeRandomNumber()): IPerson => ({name, age});
npm i -S chance ramda
npm i -D @types/chance @types/ramda
import Chance from 'chance'
imoprt * as R from 'ramda'
타입을 설정하는 것
예시
let a: string = 'text'; // 문자열
let b: number = 0; // 숫자형
let c: boolean = true; // 논리형
let d: any = true; // 어떤 타입이 올지 모를 때
let u: undefined = undefined // undefined는 타입이기도 하고 값이기도 함
let e: string | number = '0'; // 문자열이나 숫자가 올 때
let n = 1 // n의 타입은 number
let b = true // b의 타입은 bool
let s = 'hello' // s의 타입은 string
let o ={} // o의 타입은 object
자바스크립트
형식
{변수이름 }
인터페이스 선언문 형식
interface 인터페이스 이름 {
속성 이름[?]: 속성타입[, ...]
}
let 변수명: 인터페이스 이름 = {name: 'jack', age: 32}
효과
interface IPerson {
name: string
age: number
}
interface IPerson {
name: string
age?: number
}
let ai: {
name: string
age: number
etc?: boolean
} = {name: 'jack', age: 32}
function printMe(me: {name: string, age: number, etc?:boolean}) {
console.log(
me.etc ?
`${me.name} ${me.age} ${me.etc}` :
`${me.name} ${me.age}`
)
}
printMe(ai)
class 클래스이름 {
[private| protected | public] 속성 이름[?]: 속성 타입 [...]
}
public, private, protect 등 접근 제한자를 이름 앞에 붙일 수 있따.
class = Person2 {
constructor(public name: string, public age?:number) {}
}
let jack2 = Person2 = new Person2('jack', 32)
console.log(jack2)
class 클래스이름 implements 인터페이스 이름 {
...
}
interface IPerson4 {
name: string
age?: number
}
class Person4 implements IPerson4 {
name: string
age: number
}
abstract class 클래스 이름 {
abstract 속성 이름:속성 타입
abstract 메서드 이름() {}
}
abstract class Abstract5 {
abstract name: string
constructor(public age?:number){}
}
class 상속클래스 extends 부모클래스 {
}
abstract class AbstractPerson5 {
abstract name: string
constructor(public age?: number) {}
}
class Person5 extends AbstractPerson5 {
constructor(public name: string, age?: number) {
super(age)
}
}
let jack5: Person5 = new Person5('Jack', 32)
console.log(jack5) // Person5 { name: 'Jack', age: 32 }
import { IPerson } from './IPerson_ICompany'
let jack: IPerson = { name: 'Jack', age: 32 }
let { name, age } = jack
console.log(name, age) // Jack 32
let address: any = {
country: 'Korea',
city: 'Seoul',
address1: 'Gangnam-gu',
address2: 'Sinsa-dong 123-456',
address3: '789 street, 2 Floor ABC building'
}
const { country, city, ...detail } = address
console.log(detail)
// 실생 결과
{
address1: 'Gangnam-gu',
address2: 'Sinsa-dong 123-456',
address3: '789 street, 2 Floor ABC building'
}
let part1 = { name: 'jane' },
part2 = { age: 22 },
part3 = { city: 'Seoul', country: 'Kr' }
let merged = { ...part1, ...part2, ...part3 }
console.log(merged) // { name: 'jane', age: 22, city: 'Seoul', country: 'Kr' }
let coord = { ...{ x: 0 }, ...{ y: 0 } }
console.log(coord) // {x:0, y: 0}
(객체 as 타입)
export default interface INameable {
name: string
}
(2)
import INameable from './INameable'
let obj: object = { name: 'Jack' }
let name1 = (<INameable>obj).name
let name2 = (obj as INameable).name
console.log(name1, name2) // Jack Jack
형식
function 함수이름( 매개변수1:타입1, 매개변수2: 타입2, ..) : 반환값타입 {
}
예시
function add(a: number, b: number): number {
return a+b
}
뜻
값을 반환하지 않는 함수를 의미함
함수 반환 타입으로만 사용 가능
예시
function printMe(name: string, age: number): void {
console.log(`name: ${name}, age: ${age}`)
}
(매개변수1:타입, 매개변수2: 타입, ...)=> 반환값 타입 = function (인자 정의 ) :함수 반환값 타입{}
let printMe2:(arg0: string, arg1: number) => void
= function (name: string, age: number): void {}
//type stringNumberFunc = (string, number?) => void
type stringNumberFunc = (arg0: string, arg1?: number) => void
let f: stringNumberFunc = function (a: string, b?: number): void {}
let g: stringNumberFunc = function (c: string, d?: number): void {}
interface INameable {
name: string
}
function getName(o:INameable) {return o.name}
let n = getName(undefined)
console.log(n)
interface INameable {
name: string
}
// function getName(o: INameable) {
function getName(o: INameable | null | undefined) {
return o != undefined ? o.name : 'unknown name'
}
let n = getName(undefined)
console.log(n) // unknown name
console.log(getName({ name: 'Jack' })) // Jack
function fn(arg1: string, arg?:number):void{}
/*
다음 책 코드는 이제 TS7051 에러가 발생하며,
해결 방법은 코드처럼 (변수:타입, 변수:타입) 형태로 함수 타입을 작성하는 것 입니다.
*/
function fn(arg?: number) {
console.log(`arg: ${arg}`)
}
fn(1) // 1
fn() // undefined
// type OptionalArgFunc = (string, number?) => void
type OptionalArgFunc = (arg?: number) => void
let h: OptionalArgFunc = fn
let add = new Function('a', 'b', 'return a + b;')
let result = add(1, 2)
console.log(result) // 3
//let add2 = function(a, b) {
let add2 = function (a: number, b: number) {
return a + b
}
console.log(add2(1, 2)) //3
let f = function (a: number, b: number) {
return a + b
}
f = function (a: number, b: number) {
return a - b
}
let value1 =
(function(a, b) { return a + b})
(1, 2) // 3