크게 2가지가 존재
타입 추론에 의해 'any'로 판단되면 컴파일 에러를 발생시키는 옵션
구현자가 any로 사용하고 싶다면 any라고 명시해주어야 함
function f1(a) {
return a * 38;
}
console.log(f1(10));
console.log(f1('Mark') + 5); //NaN
//구현자가 NaN 나오도록 의도한 것 일때를 제외하면 잘못된 코드임
//즉 noImplicitAny 옵션을 켜면 이러한 상태에서 컴파일단계에서 에러를 알 수 있음
모든 타입에 자동으로 포함되어 있는 null과 undefined를 제거 해줌
function f2(a) {
if (a > 0) {
return a * 38;
}
}
//매개변수의 타입은 지정 했으나, return은 명시되어 있지 않아서 number로 추론됨
console.log(f2(-3) + 5); //NaN
//구현자에 의도라면 에러가 발생되어야 하지만 number타입안에 기본적으로 undefined가 내장되어 있어서 NaN이 return 됨.
// 이러한 현상을 막고자 strictNullChecks 옵션을 사용
함수 내에서 모든 코드가 값을 리턴하지 않으면, 에러발생
예를 들어, if문 사용시 if에만 return값을 지정하고 else에는 지정하지 않으면 에러발생
function f3(a: number) {
if (a>0) {
return a * 39;
}
}
let sub1: 1 = 1; //1 type
let sup1: number = sub1; //number type
sub1 = sup1; // error! Type 'number' is not assignable to type '1'.
//object > array
let sub2: number[] = [1]; //array
let sup2: object = sub2; //object
sub2 = sup2; // error! Type '{}' is missing the following properties from type 'number[]': length, pop, push, concat, and 16 more.
//array > tuple
let sub3: [number, number] = [1, 2]; //tuple
let sup3: number[] = sub3;
sub3 = sup3; // error! Type 'number[]' is not assignable to type '[number, number]'. Target requires 2 element(s) but source may have fewer.
// number , any
let sub4: number = 1;
let sup4: any = sub4;
sub4 = sup4;
// number > never
let sub5: never = 0 as never;
let sup5: number = sub5;
sub5 = sup5; // error! Type 'number' is not assignable to type 'never'.
//
class Animal {}
class Dog extends Animal {
eat() {}
}
let sub6: Dog = new Dog();
let sup6: Animal = sub6;
sub6 = sup6; // error! Property 'eat' is missing in type 'SubAnimal' but required in type
class Person {}
class Developer extends Person {
coding() {} }
class StartupDeveloper extends Developer {
burning() {}
}
function tellme(f: (d: Developer) => Developer) {}
// Developer => Developer Developer => Developer
// okay
tellme(function dToD(d: Developer): Developer {
return new Developer();
});
// Developer => Developer Person => Developer
// okay
tellme(function pToD(d: Person): Developer {
return new Developer();
});
// Developer => Developer StartipDeveloper => Developer
// okay
// strictFunctionTypes를 켜면 에러 발생
tellme(function sToD(d: StartupDeveloper): Developer {
return new Developer();
});
type MyStringType = string;
const str = 'world';
let myStr: MyStringType = 'hello';
myStr = str;
str = myStr;
// 구조가 같으면 같은 타입..
let person: string | number = 0;
person = 'Mark';
type StringOrNumber = string | number;
let another: StringOrNumber = 0;
another = 'Anna';
let person: [string, number] = ['Mark', 35];
type PersonTuple = [string, number];
let another: PersonTuple = ['Anna', 24];
type EatType = (food: string) => void;