타입을 선언하고 선언된 타입의 값만이 할당될 수 있다.
static typing에는 타입추론(type Inference), 타입명시(Type Annotations) 이렇게 2가지가 있다.
let user = {
name: 'code kim',
course : 'typescript'
score : 90
code: function(){
console.log('good');
}
}
user.name = 10;
// type '10' in not assignable to type 'string' 이라는 오류가 나온다.
function score(point){
return 100 - point;
}
// 여기서는 return에서 100-point 부분에서 타입이 number로 추론되고
//있기때문에 파라미터 부분에서 에러가 발생하게 된다.
이렇게 타입스크립트에서는 타입 표기가 없는 경우 코드를 읽고 분석하여 타입을 유추할 수 있다.
//app.ts
let userId : number = 1;
//userId = hello -> 에러발생
let userName : string = 'code kim';
let age : number = 30;
let gender : string = 'male';
let courseCompleted : boolean = true;
//여기서 만약 userId = hello로 입력하게되면
//userId 변수는 number타입으로 명시되어있기 때문에 에러가 발생된다.
---------------------------------------------------------
//app.js
var userId = 1;
var userName = 'code kim';
var age = 30;
var gender = 'male';
var courseCompleted = true;
app.ts 파일의 형태처럼 변수명 앞에 직접 타입을 명시해서 사용을 하는 방법을 타입명시라고 한다.
function getUserDetail(userId:number):{
userId : number;
userName : string;
age : number;
gender : string;
courseCompleted : boolean;
// 반환되는 객체의 구조를 타입으로 지정
}{
return null;
}
타입이 명시된 함수는 반드시 값이 return 되야한다.
let userId : number = 1;
let userName : string = 'code kim';
let age : number = 30;
let gender : string = 'male';
let courseCompleted : boolean = true;
interface UserInfo{
userId : number;
userName : string;
age : number;
gender : string;
courseCompleted : boolean;
}
function getUserDetail(userId: number): UserInfo {
{
return {
userId: 3,
userName: "code lee",
age: 27,
gender: "female",
courseCompleted: true,
};
}
}
interface의 이름은 대문자로 시작하며 interface는 타입으로서 사용가능하다. interface를 타입으로 가지는 값은 interface의 구조를 값으로 가지도록 강제되는데 이뜻은 위 코드 내용으로 설명하게되면 getUserDetail의 반환값은 UserInfo의 정의된 프로퍼티를 가져야한다는 뜻이다.
function getUserDetail(userId: number): UserInfo {
{
return {
userId: 3,
userName: "code lee",
age: 27,
//gender: "female", // 이렇게 삭제하게되면 에러발생
courseCompleted: true,
};
}
}
interface UserInfo{
userId : number;
userName : string;
age : number;
gender? : string; // key값앞에 선택적 프로퍼티인 '?'를 붙여준다.
courseCompleted : boolean;
}
function getUserDetail(userId: number): UserInfo {
{
return {
userId: 3,
userName: "code lee",
age: 27,
gender: "female",
// gender부분에 선택적 프로퍼티가 적용되었기 때문에 에러가 발생되지 않는다.
courseCompleted: true,
};
}
}
위와같이 선택적 프로퍼티를 사용하게되면 프로퍼티중 필수적이지 않은 값에 대해서 유연하게 적용 할 수 있다.
interface UserInfo{
userId : number;
userName : string;
age : number;
gender? : string;
courseCompleted : boolean;
}
function getUserDetail(userId: number): UserInfo {
{
return {
userId: 3,
userName: "code lee",
age: 27,
gender: "female",
courseCompleted: true,
};
}
}
function saveUserDetails(user:UserInfo): void{
// 반환되는 값이 없으므로 void로 처리
} // 함수의 파라미터에 interface값을 지정
saveUserDetails({
userId : 2,
userName : 'code park',
age : 29,
gender : 'female',
courseCompleted : false
}) // 위에 선언한 함수르 호출하여 인자값을 할당하게 되면 interface를 재사용 할 수 있다.
위의 코드내용처럼 함수의 파라미터에 interface를 지정하고 return값이 없으므로 void처리한 후 함수호출 시 인자값을 UserInfo 형식에 맞춰 호출하게되면 재사용이 가능하다.
interface UserInfo{
userId : number;
userName : string;
age : number;
gender? : string;
courseCompleted : boolean;
}
let user1 = {
userId : 2,
userName : 'code park',
age : 29,
gender : 'female',
courseCompleted : false
} // 선언되어진 interface의 타입과 동일하게 작성 후 객체를 아래 saveUserDetails 함수의 인자값으로 할당
function getUserDetail(userId:number): UserInfo{
{
return {
userId : 3,
userName : 'code lee',
age : 27,
gender : 'female',
courseCompleted : true
}
}
function saveUserDetails(user:UserInfo): void{
// 반환되는 값이 없으므로 void로 처리
} // 함수의 파라미터에 interface값을 지정
saveUserDetails(user1)
//인자값으로 위에 선언한 객체인 user1을 할당하게되면
//위에서 설명한 interface 재사용의 결과물처럼 동일한 내용을 얻을 수 있다.
객체를 따로 선언한 뒤 그 선언된 객체를 호출할 함수의 인자값으로 넣어주게 되면 동일한 결과를 얻을 수 있다.
interface UserInfo{
userId : number;
userName : string;
age : number;
gender : string;
courseCompleted : boolean;
addComment? : (comment : string) => string;
//addComment라는 메소드 정의 후 comment라는 string 값을가진 파라미터를 가지고 있고 string 값을 반환 해 준다.
}
interface UserInfo{
readonly userId : number; // 키값 앞에 readonly 지정
userName : string;
age : number;
gender : string;
courseCompleted : boolean;
}
function saveUserDetails(user:UserInfo): void{
UserInfo.userId = 3456;
// userId는 읽기전용 프로퍼티이기 때문에 수정될 수 없어서 에러가 발생
}
위의 코드 내용처럼 readonly 지정된 프로퍼티는 수정될 수 없기 때문에 에러를 발생시킨다.