"user" 부분을 따옴표 없이 했을 때 에러가 난다면 따옴표를 붙이고 해보는 것도 좋다.
외래키는 부모테이블의 기본키로만 연결할 수 있고 아닐 경우 외래키 설정이 안 된다. 그 기본키의 컬럼타입과도 같아야한다.
ON DELETE CASCADE ON UPDATE CASCADE : 만약 이 조건을 지정하지 않으면 제약 검증을 실패할 경우 삭제 또는 수정이 되지 않는다. 부모 테이블에서 row 를 삭제/수정할 경우 연결된 자식 테이블의 row 가 함께 삭제/수정된다. 연결된 데이터를 한 번에 삭제/수정할 수 있어 데이터의 관리가 편리해지고 일관성을 유지할 수 있다.
CREATE TABLE password (
password_id SERIAL PRIMARY KEY,
user_no INTEGER UNIQUE NOT NULL,
salt VARCHAR(128),
CONSTRAINT password_fk FOREIGN KEY(user_no) REFERENCES "user"(user_no) ON DELETE CASCADE ON UPDATE CASCADE
);
FOREIGN KEY– 테이블의 열 또는 열 그룹의 값이 다른 테이블의 열 또는 열 그룹에 있는지 확인합니다.기본 키와 달리 테이블에는 많은 외래 키가 있을 수 있습니다.
테이블 만들기
CREATE TABLE user (
user_no serial PRIMARY KEY,
user_name VARCHAR ( 50 ) UNIQUE NOT NULL,
);
CREATE TABLE profile (
profile_id serial PRIMARY KEY,
user_no INTEGER UNIQUE NOT NULL,
join_date DATE NOT NULL,
);
인터페이스를 인자로 받아 사용할 때 항상 인터페이스의 속성 갯수와 인자로 받는 객체의 속성 갯수를 일치시키지 않아도 된다. 다시 말해, 인터페이스에 정의된 속성, 타입의 조건만 만족한다면 객체의 속성 갯수가 더 많아도 상관 없다는 의미입니다.
인터페이스에 선언된 속성 순서를 지키지 않아도 됩니다.
옵션 속성
interfacepersonAge {
age:number;
name:string;
}
functionlogAge(obj:personAge) {
console.log(obj.age);
console.log(obj.name);
}
letperson= { age:28 , hop:89};
logAge(person); // ERROR: Argument of type '{ age: number; hop: number; }' is not assignable to parameter of type 'personAge'. Property 'name' is missing in type '{ age: number; hop: number; }' but required in type 'personAge'.
// call 또는 apply의 첫 번째 인자로 객체가 전달될 수 있으며 this가 그 객체에 묶임
var obj = {a: 'Custom'};
// 변수를 선언하고 변수에 프로퍼티로 전역 window를 할당
var a = 'Global';
function whatsThis() {
return this.a; // 함수 호출 방식에 따라 값이 달라짐
}
whatsThis(); // this는 'Global'. 함수 내에서 설정되지 않았으므로 global/window 객체로 초기값을 설정한다.
whatsThis.call(obj); // this는 'Custom'. 함수 내에서 obj로 설정한다.
whatsThis.apply(obj); // this는 'Custom'. 함수 내에서 obj로 설정한다.
function add(c, d) {
return this.a + this.b + c + d;
}
var o = {a: 1, b: 3};
// 첫 번째 인자는 'this'로 사용할 객체이고,
// 이어지는 인자들은 함수 호출에서 인수로 전달된다.
add.call(o, 5, 7); // 16
// 첫 번째 인자는 'this'로 사용할 객체이고,
// 두 번째 인자는 함수 호출에서 인수로 사용될 멤버들이 위치한 배열이다.
add.apply(o, [10, 20]); // 34
비엄격 모드에서this로 전달된 값이 객체가 아닌 경우,call과apply는 이를 객체로 변환하기 위한 시도를 합니다.
f.bind(someObject)를 호출하면 this는 원본 함수를 가진 새로운 함수를 생성합니다. 새 함수의this는 호출 방식과 상관없이 영구적으로 bind()의 첫 번째 매개변수로 고정됩니다.
function f() {
return this.a;
}
var g = f.bind({a: 'azerty'});
console.log(g()); // azerty
var h = f.bind({a: 'yoo'}); // bind는 한 번만 동작함!
console.log(h()); // yoo
var i = h.bind({a: 'fff'});
console.log(i()); // yoo
var o = {a: 37, f: f, g: g, h: h};
console.log(o.a, o.f(), o.g(), o.h()); // 37, 37, azerty, yoo
화살표 함수
화살표 함수를 call(), bind(), apply()를 사용해 호출할 때 this의 값을 정해주더라도 무시합니다. 어떤 방법을 사용하든함수의this는 생성 시점의 것으로 설정됩니다. 사용할 매개변수를 정해주는 건 문제 없지만, 첫 번째 매개변수(thisArg)는 null을 지정해야 합니다.
객체의 메소드
함수가 정의된 방법이나 위치에 전혀 영향을 받지 않는 것에 유의해라.
아래에서 independent 함수가 나중에 객체에 포함되어도 this가 그 객체를 가리키며 객체안의 객체에 포함되면 객체안의 객체를 가리킨다.
const test = {
prop: 42,
func: function() {
return prop; // 그냥 접근 불가능, test.prop 또는 this.prop으로 접근 가능하다.
},
};
console.log(test.func());
var o = {prop: 37};
function independent() {
return this.prop;
}
o.f = independent;
console.log(o.f()); // logs 37
o.b = {g: independent, prop: 42};
console.log(o.b.g()); // logs 42
객체의 프로토타입 체인에서의 this
함수 f 는 p 의 메소드로서 호출된 이후로, this 는 p 를 나타낸다. 이것은 JavaScript 의 프로토타입 상속의 흥미로운 기능이다.
var o = {
f:function() { return this.a + this.b; }
};
var p = Object.create(o);
p.a = 1;
p.b = 4;
console.log(p.f()); // 5
DOM 이벤트 처리기
함수를 이벤트 처리기로 사용하면 this는 이벤트를 발사한 요소로 설정됩니다. 일부 브라우저는addEventListener()외의 다른 방법으로 추가한 처리기에 대해선 이 규칙을 따르지 않습니다.
인라인 이벤트 핸들러
두번째 경우에 this는 window를 가리킨다. 첫번째 경우에 올바르게 현재 버튼을 가리킨다.
<button onclick="alert(this.tagName.toLowerCase());">
this 표시
</button>
<button onclick="alert((function() { return this; })());">
내부 this 표시
</button>
lettup: [string, number] = ['a',1]; // tuple: 배열의 길이는 고정, 각 요소의 타입이 지정되어 있는 배열
letevery:any="hi";
letprintSomething= (a:number, b:number):void=> {
console.log(a+b);
};
Enum
TypeScript 열거형은 상수 값의 그룹입니다. 기본적으로 0부터 시작합니다.
enumColor {Red=1, Green, Blue}
letc:Color=Color.Green;
console.log(c); // 2
letd:string=Color[0];
lete:string=Color[2];
console.log(d); // undefined
console.log(e); // "Green"
Never
타입스크립트에서never타입은 값의 공집합이다. 집합에 어떤 값도 없기 때문에,never타입은any타입의 값을 포함해 어떤 값도 가질 수 없다. 그래서never타입은 때때로점유할 수 없는또는바닥 타입이라고 불린다.
숫자 체계에 아무것도 없는 양을 나타내는0처럼 문자 체계에도불가능을 나타내는 타입이 필요하다.
절대 발생할 수 없는 타입을 나타냄
종료되지 않는 함수
함수의 끝에 절대 도달하지 않는다는 의미
never는 함수 표현식이나 화살표 함수 표현식에서 항상 오류를 발생시키거나 절대 반환하지 않는 반환 타입으로 쓰인다.
변수 또한 타입 가드에 의해 아무 타입도 얻지 못하게 좁혀지면never타입을 얻게 될 수 있다.
// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
functionerror(message:string):never {
thrownewError(message);
}
// 반환 타입이 never로 추론된다.
functionfail() {
returnerror("Something failed");
}
// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
// break를 사용하면 error 발생
functioninfiniteLoop():never {
while (true) {
}
}
null , undefined
// 이 밖에 이 변수들에 할당할 수 있는 값이 없습니다!
letu:undefined=undefined;
letn:null=null;
연산자를 이용한 타입 정의
Union Type
유니온 타입(Union Type)이란 자바스크립트의 OR 연산자(||)와 같이 A이거나 B이다 라는 의미의 타입입니다.
* 타입스크립트 관점에서는introduce()함수를 호출하는 시점에Person타입이 올지Developer타입이 올지 알 수가 없기 때문에 어느 타입이 들어오든 간에 오류가 안 나는 방향으로 타입을 추론하게 됩니다. 기본적으로는Person과Developer두 타입에 공통적으로 들어있는 속성인name만 접근할 수 있게 됩니다.
// any를 사용하는 경우
functiongetAge1(age:any) {
age.toFixed(); // 에러 발생, age의 타입이 any로 추론되기 때문에 숫자 관련된 API를 작성할 때 코드가 자동 완성되지 않는다.
returnage;
}
// 유니온 타입을 사용하는 경우
functiongetAge2(age:number|string) {
if (typeofage==='number') {
age.toFixed(); // 정상 동작, age의 타입이 `number`로 추론되기 때문에 숫자 관련된 API를 쉽게 자동완성 할 수 있다.
returnage;
}
if (typeofage==='string') {
returnage;
}
returnnewTypeError('age must be number or string');