let str: string;
let red: string = 'Red';
let green: string = 'Green';
let myColor: string = `My color is ${red}`
let num: number;
let integer: number = 6;
let float: number = 3.14;
let hex: number = NaN;
infact , if you used java you know that float is not number ,
In other words , it is not int but , typescript uses integers
let isBoolean: boolean;
let isDone: boolean = false;
const size: number = 123;
const isBig: boolean = size >= 100;
console.log("isBig : ", isBig); // true
let name : string | number = 'ahn';
let name : string | number = 123;
let name : string[] | number = ['test1' ,'test2' , 'test3'];
// string
let fruits1: string[] = ["apple", "banana", "mango"]
let fruits3: Array<string> = ["apple1", "banana1", "mango1"]
// number
let oneToSeven1: number[] = [1, 3, 4, 5, 6, 7];
let oneToSeven3: Array<number> = [1, 3, 4, 5]
let array: (string | number)[] = ['Apple', 1, 3, 'Banana', 'Mango', 3];
let array3: Array<string | number> = ['Apple', 1, 3, 'Banana', 'Mango', 3];
let someArr: any[] = [0, 1, {}, [], 'str', false];
type myType = string | number;
let name :myType =123;
type Member = [number , boolean];
let ahn : Member = [123, true]
let ahn : Member = ['123', true] // 에러 발생
type Member = {
name : string
}
let ahn : Member = {name : 'ahn'}
let ahn : Member = {name : 123} // 에러 발생
type Member = {
[key : string] : string,
}
let ahn : Member = {name : 'ahn' , age : '123' , number: '456'}
const genre_data:string[] = ['comic' , 'action','romance'];
interface MovieData {
action : number;
comic : number;
romance : number;
}
// interface MovieData {
// [key: string] : number;
// }
let data : MovieData = {
'comic' : 1,
'action' : 2,
'romance' : 3
};
genre_data.forEach(genre => {
data[`${genre}`] += 1
});
console.log(data);
// Tuple
let user: [number, string, boolean] = [1234, 'HEROPY', true];
console.log(user[0]); // 1234
console.log(user[1]); // 'HEROPY'
console.log(user[2]); // true
let name : {name : string} = {name : 'kim'}
let name : {name : string} = {} // optional
void
function add(num1 : number , num2 : number):void {
console.log(num1 + num2);
}
return type
function add(num1 : number , num2 : number):void {
console.log(num1 + num2);
}
function adult(age : number):boolean {
return age > 19;
}
function functionTest ( x: number) : number {
return x * 2;
}
functionTest(2);
functionTest('2'); // 에러발생
import { log } from "console";
function hello(name?:string){
return `hello , ${name || "world"}`;
}
const result = hello();
const result2 = hello("sam");
log(result); // hello , world
log(result2) // hello , sam
import { log } from "console";
function hello(name?:string) {
return `Hello , ${name || "world"}`;
}
function hello2(name = "world") {
return `Hello , ${name}`;
}
const result = hello();
const result2 = hello("Sam");
log(result) // Hello , world
log(result2) // Hello , Sam
array
let list:string[] = ['test1' , 'test2' , 'test3'];
for (let i in list){
console.log(i , list[i]);
}
of course you can't type designation
let list = ['test1' , 'test2' , 'test3'];
for (let i in list){
console.log(i , list[i]);
}
// a apple
// b bird
// c crazy
object
let obj:any = {"a":"apple", "b":"bird", "c":"crazy"};
for (let property in obj) {
console.log(property, obj[property])
}
// a apple
// b bird
// c crazy
let string : string = "hello";
for (const s of string){
console.log(s);
}
// h
// e
// l
// l
// o
class Car {
color : string;
constructor(color:string){
this.color = color;
}
start(){
console.log("start")
}
}
const bmw = new Car("red");
bmw.start();
class Car {
// color : string;
constructor(public color:string){
this.color = color;
}
start(){
console.log("start")
}
}
const bmw = new Car("red");
bmw.start();
class Car {
private name : string = "car";
color:string;
constructor(color:string){
this.color =color;
}
start(){
console.log("start");
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name); // 여기서 에러발생 -> private
}
}
const z4 = new Bmw("black");
class Car {
protected name : string = "car";
color:string;
constructor(color:string){
this.color =color;
}
start(){
console.log("start");
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name); // protected 는 상속
}
}
const z4 = new Bmw("black");
class Car {
// color: string;
constructor(readonly color: string) {
this.color = color;
}
start() {
console.log(`start ${this.color}`);
}
}
const bmw = new Car("red")
bmw.start()
class Car {
readonly name: string = "car";
color: string;
static wheels = 4;
constructor(color: string, name) {
this.color = color;
this.name = name;
}
start() {
console.log("start");
console.log(this.name);
console.log(this.wheels); // 에러발생
}
}
class Bmw extends Car{
constructor(color: string, name) {
super(color, name);
}
showName() {
console.log(super.name);
}
}
const z4 = new Bmw("black", "zzzz4");
console.log(z4.wheels); // 에러발생
지금과 같이 작성하게되면 에러가 발생하게 된다.
이유는 this 로 접근이 되지않고 , 인스턴스로 접근이 되지않기 때문이다.
멤버변수에다가 static 을 사용하게되면 this 로 불러오는것이 아니라 , 클래스명을 적어서 불러와야한다.
멤버변수뿐만아니라 메서드에도 static 을 사용하게 되면 클래스명을 적어서 불러와야한다.
class Car {
readonly name: string = "car";
color: string;
static wheels = 4;
constructor(color: string, name) {
this.color = color;
this.name = name;
}
start() {
console.log("start");
console.log(this.name);
console.log(Car.wheels);
}
static staticStart() {
console.log("static start");
}
}
class Bmw extends Car{
constructor(color: string, name) {
super(color, name);
}
showName() {
console.log(super.name);
}
}
const z4 = new Bmw("black", "zzzz4");
console.log(Car.wheels);
console.log(Car.staticStart);
추상클래스는 new 를 이용해서 인스턴스를 한다거나 객체를 만들수가 없습니다.
오로지 상속을 통해서만 가능합니다.
abstract class Car {
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("start");
}
}
const car = new Car("red");
class Bmw extends Car{
constructor(color: string) {
super(color);
}
}
const z4 = new Bmw("red");
console.log(z4);
추상클래스에서 적은 변수라던지 메서드는 상속 받은 쪽에서 반드시 작성을 해줘야한다.
그렇지 않으면 에러가 발생하게 된다.
구체적인 기능은 상속받는쪽에서 작성한다고 생각하면 된다.
abstract class Car {
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("start");
}
abstract doSomething(): void;
}
// const car = new Car("red");
class Bmw extends Car{
constructor(color: string) {
super(color);
}
doSomething() {
alert(3);
}
}
const z4 = new Bmw("red");
console.log(z4);
제네릭을 사용하게 되면 , 클래스나 함수 인터페이스를 다양한 타입으로 재 사용할 수가 있다.
선언할때는 그냥 타입파라미터만 적어두고 생성하는 시점에서 사용하는 타입을 결장하게 된다.
function getSize<T>(arr: T[]): number {
return arr.length;
}
const arr1 = [1, 2, 3];
getSize(arr1);// 3
getSize<number>(arr1);
const arr2 = ["a","b","c"];
getSize(arr2);// 3
getSize<string>(arr2);// 3
const arr3 = [false , true , true];
getSize(arr3);// 3
const arr4 = [{}, {},{name:"Tim"}];
getSize(arr4);// 3
interface Mobile<T> {
name: string;
price: number;
option: T;
}
const m1: Mobile<object> = {
name: "s21",
price: 1000,
option: {
color: "red",
coupon : false,
}
}
const m2: Mobile<string> = {
name: "s20",
price: 900,
option:"good"
}
interface User{
name: string;
age: number;
}
interface Car{
name: string;
color:string;
}
interface Book{
price:number;
}
const user: User = { name: 'a', age: 10 };
const car: Car = { name: 'bmw', color: 'red' };
const book: Book = { price: 3000 };
function showName(data): string{
return data.name;
}
showName(user);
showName(car);
showName(book);
위와같은 코드를 제네릭을 사용해서 적용해 볼것이다.
interface User{
name: string;
age: number;
}
interface Car{
name: string;
color:string;
}
interface Book{
price:number;
}
const user: User = { name: 'a', age: 10 };
const car: Car = { name: 'bmw', color: 'red' };
const book: Book = { price: 3000 };
function showName<T>(data:T): string{
return data.name; // name 에서 에러가발생한다.
}
showName(user);
showName(car);
showName(book);
T 에는 name 이 없다고 나와있다.
User , Car 에는 name 이 있는 Book 에는 name 이 안보인다.
그러니 모든 매개변수에 name 이 있다고 장담하지 못하니깐 에러가 발생하게 된다.
interface User{
name: string;
age: number;
}
interface Car{
name: string;
color:string;
}
interface Book{
price:number;
}
const user: User = { name: 'a', age: 10 };
const car: Car = { name: 'bmw', color: 'red' };
const book: Book = { price: 3000 };
function showName<T extends {name:string}>(data:T): string{
return data.name;
}
showName(user);
showName(car);
showName(book);
// 제네릭타입에 확장을 해서 name:string 인 객체를 확장한 형태이다.
// 다양한 객체가 올순 있지만 항상 name:string 을 가지고있어야한다
function list_merge1<A>(a:Array<A>, b:Array<A>): Array<A> {
return a.concat(b);
}
function list_merge2<A extends string[], B extends string[]>(a: A, b: B): string[] {
return a.concat(b);
}
const merged3 = list_merge1(["1"], ["string1", "string2", "string3"])
console.log(merged3);
const merged4 = list_merge2([1], ["string1", "string2", "string3"])
console.log(merged4);