μμ±μμ μ¬μ©μμ κ΄μ μΌλ‘ μ½λ λ°λΌλ³΄κΈ°
νμ μμ€ν
- Explicit Types: μ»΄νμΌλ¬μκ² μ¬μ©νλ νμ μ λͺ μμ μΌλ‘ μ§μ νλ μμ€ν (ex. C, C++)
- Implicit Types: μ»΄νμΌλ¬κ° μλμΌλ‘ νμ μ μΆλ‘ νλ μμ€ν (ex. μλ°μ€ν¬λ¦½νΈ)
νμ μ€ν¬λ¦½νΈμ νμ μμ€ν
- νμ μ€ν¬λ¦½νΈμμλ λ κ°μ§ νμ μμ€ν μ λ€ μ¬μ©ν μ μλ€.
- C, C++κ³Ό κ°μ΄ νμ μ λͺ μμ μΌλ‘ μ§μ ν μ μλ€.
- νμ μ λͺ μμ μΌλ‘ μ§μ νμ§ μμΌλ©΄, νμ μ€ν¬λ¦½νΈ μ»΄νμΌλ¬κ° μλμΌλ‘ νμ μ μΆλ‘
νμ μ€ν¬λ¦½νΈμμ μ±νν νμ μμ€ν
μλ°μ€ν¬λ¦½νΈμμλ λ³μμ νμ μ κ΄κ³μμ΄ λ³μλ§ μμ±νλ©΄ λλ€. λ³μκ° μ΄λ€ νμ μΈμ§ μ κ²½μ μ°μ§ μμλ λλ€. μ¦ Implicit Type(μμμ νμ )μ μ¬μ©νλ€. νμ§λ§, C, C++κ³Ό κ°μ μΈμ΄λ Explicit Type(λͺ μμ νμ )μ λ³μλ₯Ό μμ±ν λ νμ μ μ ν΄μ£Όμ΄μΌ νλ€. 1μ΄λΌλ λ³μλ numberλΌλ κ²μ μ½λμ λͺ μν΄μΌ νλ€. νμ μ€ν¬λ¦½νΈλ Implicit Typeμ μ½λ μμ±, Explicit Typeμ μ½λ μμ± λ°©λ² λ λ€ μ¬μ© κ°λ₯νλ€. C, C++κ³Ό κ°μ΄ λ°μ΄ν°μ λ³μμ νμ μ λͺ μμ μΌλ‘ μ μν μ μκ³ μλ°μ€ν¬λ¦½νΈμ²λΌ μμμ μΌλ‘ λ³μλ§ μμ±ν μλ μλ€.
νμ μ€ν¬λ¦½νΈμ μ₯μ μ μλ°μ€ν¬λ¦½νΈμ²λΌ μμμ μΌλ‘ λ³μλ₯Ό μμ±νλλΌλ νμ μ μΆλ‘ ν΄μ€λ€λ μ μ΄λ€.
let a = "hello"
a = "bye"
let b: boolean = false
let c : number[] = [1, 2, 3] // number array
c.push("1") // νμ© x
const player = {
name: "imae"
}
player.name = "jm" // mix type X!
μλ°μ€ν¬λ¦½νΈμμλ νμ μ μκ΄μμ΄ λ³μλ₯Ό λ°κΎΈλ κ²μ΄ κ°λ₯νμ§λ§, νμ μ€ν¬λ¦½νΈμμλ λΆκ°λ₯νλ€. μλ₯Ό λ€μ΄ λ³μλ₯Ό stringμΌλ‘ μ μΈνλ€λ©΄ stringμΌλ‘λ§ λ³μλ₯Ό λ³κ²½ν μ μλ€. νμ μ€ν¬λ¦½νΈλ Type Checkerκ° νμ μ 체ν¬ν΄μ€λ€. stringμμ numberμ κ°μ mix typeμ νμ©λμ§ μλλ€.
νμ μ΄λ ν΄λΉ λ³μκ° ν μ μλ μΌμ κ²°μ νλ€.
// JavaScript
// f1 μ΄λΌλ ν¨μμ body μμλ a λ₯Ό μ¬μ©ν κ² μ
λλ€.
// a κ° ν μ μλ μΌμ a μ νμ
μ΄ κ²°μ ν©λλ€.
function f1(a) {
return a;
}
ν¨μ μ¬μ©λ²μ λν μ€ν΄λ₯Ό μΌκΈ°νλ μλ°μ€ν¬λ¦½νΈ
// JavaScript
// (f2 μ€νμ κ²°κ³Όκ° NaN μ μλν κ²μ΄ μλλΌλ©΄)
// μ΄ ν¨μμ μμ±μλ λ§€κ°λ³μ a κ° number νμ
μ΄λΌλ κ°μ μΌλ‘ ν¨μλ₯Ό μμ±νμ΅λλ€.
function f2(a) {
return a * 38;
}
// μ¬μ©μλ μ¬μ©λ²μ μμ§νμ§ μμ μ±, λ¬Έμμ΄μ μ¬μ©νμ¬ ν¨μλ₯Ό μ€ννμ΅λλ€.
console.log(f2(10)); // 380
console.log(f2('Mark')); // NaN
νμ μ€ν¬λ¦½νΈμ μΆλ‘ μ μμ§νλ κ²½μ°
// νμ
μ€ν¬λ¦½νΈ μ½λμ§λ§,
// a μ νμ
μ λͺ
μμ μΌλ‘ μ§μ νμ§ μμ κ²½μ°μ΄κ° λλ¬Έμ a λ any λ‘ μΆλ‘ λ©λλ€.
// ν¨μμ λ¦¬ν΄ νμ
μ number λ‘ μΆλ‘ λ©λλ€. (NaN λ number μ νλμ
λλ€.)
function f3(a) {
return a * 38;
}
// μ¬μ©μλ a κ° any μ΄κΈ° λλ¬Έμ, μ¬μ©λ²μ λ§κ² λ¬Έμμ΄μ μ¬μ©νμ¬ ν¨μλ₯Ό μ€ννμ΅λλ€.
console.log(f3(10)); // 380
console.log(f3('Mark') + 5); // NaN
nolmplicitAny μ΅μ μ μΌλ©΄
νμ μ λͺ μμ μΌλ‘ μ§μ νμ§ μμ κ²½μ°, νμ μ€ν¬λ¦½νΈκ° μΆλ‘ μ€ `any`λΌκ³ νλ¨νκ² λλ©΄,
μ»΄νμΌ μλ¬λ₯Ό λ°μμμΌ λͺ μμ μΌλ‘ μ§μ νλλ‘ μ λνλ€.
nolmplicitAnyμ μν λ°©μ΄
// error TS7006: Parameter 'a' implicitly has an 'any' type.
function f3(a) {
return a * 38;
}
// μ¬μ©μμ μ½λλ₯Ό μ€νν μ μμ΅λλ€. μ»΄νμΌμ΄ μ μμ μΌλ‘ λ§λ¬΄λ¦¬ λ μ μλλ‘ μμ ν΄μΌ ν©λλ€.
console.log(f3(10));
console.log(f3('Mark') + 5);
number νμ μΌλ‘ μΆλ‘ λ λ¦¬ν΄ νμ
// λ§€κ°λ³μμ νμ
μ λͺ
μμ μΌλ‘ μ§μ νμ΅λλ€.
// λͺ
μμ μΌλ‘ μ§μ νμ§ μμ ν¨μμ λ¦¬ν΄ νμ
μ number λ‘ μΆλ‘ λ©λλ€.
function f4(a: number) {
if (a > 0) {
return a * 38;
}
}
// μ¬μ©μλ μ¬μ©λ²μ λ§κ² μ«μνμ μ¬μ©νμ¬ ν¨μλ₯Ό μ€ννμ΅λλ€.
// ν΄λΉ ν¨μμ λ¦¬ν΄ νμ
μ number μ΄κΈ° λλ¬Έμ, νμ
μ λ°λ₯΄λ©΄ μ΄μ΄μ§ μ°μ°μ λ°λ‘ ν μ μμ΅λλ€.
// νμ§λ§ μ€μ undefined + 5 κ° μ€νλμ΄ NaN μ΄ μΆλ ₯λ©λλ€.
console.log(f4(5)); // 190
console.log(f4(-5) + 5); // NaN
strictNullChecks μ΅μ μ μΌλ©΄
λͺ¨λ νμ μ μλμΌλ‘ ν¬ν¨λμ΄ μλ `null` κ³Ό `undefined`λ₯Ό μ κ±°ν΄μ€λ€.
number | undefined νμ μΌλ‘ μΆλ‘ λ λ¦¬ν΄ νμ
// λ§€κ°λ³μμ νμ
μ λͺ
μμ μΌλ‘ μ§μ νμ΅λλ€.
// λͺ
μμ μΌλ‘ μ§μ νμ§ μμ ν¨μμ λ¦¬ν΄ νμ
μ number | undefined λ‘ μΆλ‘ λ©λλ€.
function f4(a: number) {
if (a > 0) {
return a * 38;
}
}
// μ¬μ©μλ μ¬μ©λ²μ λ§κ² μ«μνμ μ¬μ©νμ¬ ν¨μλ₯Ό μ€ννμ΅λλ€.
// ν΄λΉ ν¨μμ λ¦¬ν΄ νμ
μ number | undefined μ΄κΈ° λλ¬Έμ,
// νμ
μ λ°λ₯΄λ©΄ μ΄μ΄μ§ μ°μ°μ λ°λ‘ ν μ μμ΅λλ€.
// μ»΄νμΌ μλ¬λ₯Ό κ³ μ³μΌνκΈ° νκΈ° λλ¬Έμ μ¬μ©μμ μμ±μκ° μλ
Όμ ν΄μΌν©λλ€.
console.log(f4(5));
console.log(f4(-5) + 5); // error TS2532: Object is possibly 'undefined'.
λͺ μμ μΌλ‘ λ¦¬ν΄ νμ μ μ§μ ν΄μΌν κΉ?
// λ§€κ°λ³μμ νμ
κ³Ό ν¨μμ λ¦¬ν΄ νμ
μ λͺ
μμ μΌλ‘ μ§μ νμ΅λλ€.
// μ€μ ν¨μ ꡬνλΆμ λ¦¬ν΄ νμ
κ³Ό λͺ
μμ μΌλ‘ μ§μ ν νμ
μ΄ μΌμΉνμ§ μμ μ»΄νμΌ μλ¬κ° λ°μν©λλ€.
// error TS2366: Function lacks ending return statement and return type does not incl
function f5(a: number): number {
if (a > 0) {
return a * 38;
}
}
nolmplicitReturns μ΅μ μ μΌλ©΄
ν¨μ λ΄μμ λͺ¨λ μ½λκ° κ°μ 리ν΄νμ§ μμΌλ©΄,
μ»΄νμΌ μλ¬λ₯Ό λ°μμν¨λ€.
λͺ¨λ μ½λμμ 리ν΄μ μ§μ ν΄μΌνλ€.
// if κ° μλ κ²½μ° return μ μ§μ νμ§ μκ³ μ½λκ° μ’
λ£λλ€.
// error TS7030: Not all code paths return a value.
function f5(a: number) {
if (a > 0) {
return a * 38;
}
}
λ§€κ°λ³μμ objectκ° λ€μ΄μ€λ κ²½μ°
// JavaScript
function f6(a) {
return `μ΄λ¦μ ${a.name} μ΄κ³ , μ°λ Ήλλ ${
Math.floor(a.age / 10) * 10
}λ μ
λλ€.`;
}
console.log(f6({ name: 'Mark', age: 38 })); // μ΄λ¦μ Mark μ΄κ³ , μ°λ Ήλλ 30λ μ
λλ€.
console.log(f6('Mark')); // μ΄λ¦μ undefined μ΄κ³ , μ°λ Ήλλ NaNλ μ
λλ€.
object literal type
function f7(a: { name: string; age: number }): string {
return `μ΄λ¦μ ${a.name} μ΄κ³ , μ°λ Ήλλ ${
Math.floor(a.age / 10) * 10
}λ μ
λλ€.`;
}
console.log(f7({ name: 'Mark', age: 38 })); // μ΄λ¦μ Mark μ΄κ³ , μ°λ Ήλλ 30λ μ
λλ€.
console.log(f7('Mark')); // error TS2345: Argument of type 'string' is not
assignable to parameter of type '{ name: string; age: number; }'.
λλ§μ νμ μ λ§λλ λ°©λ²
interface PersonInterface {
name: string;
age: number;
}
type PersonTypeAlias = {
name: string;
age: number;
};
function f8(a: PersonInterface): string {
return `μ΄λ¦μ ${a.name} μ΄κ³ , μ°λ Ήλλ ${
Math.floor(a.age / 10) * 10
}λ μ
λλ€.`;
}
console.log(f8({ name: 'Mark', age: 38 })); // μ΄λ¦μ Mark μ΄κ³ , μ°λ Ήλλ 30λ μ
λλ€.
console.log(f8('Mark')); // error TS2345: Argument of type 'string' is not
assignable to parameter of type 'PersonInterface'.
Structural Type System vs Nominal Type System
structural type system - κ΅¬μ‘°κ° κ°μΌλ©΄, κ°μ νμ
interface IPerson {
name: string;
age: number;
speak(): string;
}
type PersonType = {
name: string;
age: number;
speak(): string;
};
let personInterface: IPerson = {} as any;
let personType: PersonType = {} as any;
personInterface = personType;
personType = personInterface;
nominal type system - κ΅¬μ‘°κ° κ°μλ μ΄λ¦μ΄ λ€λ₯΄λ©΄, λ€λ₯Έ νμ
type PersonID = string & { readonly brand: unique symbol };
function PersonID(id: string): PersonID {
return id as PersonID;
}
function getPersonById(id: PersonID) {}
getPersonById(PersonID('id-aaaaaa'));
getPersonById('id-aaaaaa'); // error TS2345: Argument of type 'string' is not
assignable to parameter of type 'PersonID'. Type 'string' is not assignable to type
'{ readonly brand: unique symbol; }'.
duck typing
λ§μ½ μ΄λ€ μκ° μ€λ¦¬μ²λΌ κ±·κ³ , ν€μμΉκ³ , κ½₯κ½₯거리λ μ리λ₯Ό λΈλ€λ©΄ λλ κ·Έ μλ₯Ό μ€λ¦¬λΌκ³ λΆλ₯Ό κ²μ΄λ€.
class Duck:
def sound(self):
print u"κ½₯κ½₯"
class Dog:
def sound(self):
print u"λ©λ©"
def get_sound(animal):
animal.sound()
def main():
bird = Duck()
dog = Dog()
get_sound(bird)
get_sound(dog)
νμ νΈνμ± Type Compatibility
μλΈ νμ (1)
// sub1 νμ
μ sup1 νμ
μ μλΈ νμ
μ΄λ€.
let sub1: 1 = 1;
let sup1: number = sub1;
sub1 = sup1; // error! Type 'number' is not assignable to type '1'.
// sub2 νμ
μ sup2 νμ
μ μλΈ νμ
μ΄λ€.
let sub2: number[] = [1];
let sup2: object = sub2;
sub2 = sup2;
// error! Type '{}' is missing the following properties from type 'number[]': length, pop, push, concat, and 16 more.
// sub3 νμ
μ sup3 νμ
μ μλΈ νμ
μ΄λ€.
let sub3: [number, number] = [1, 2];
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.
μλΈ νμ (2)
// sub4 νμ
μ sup4 νμ
μ μλΈ νμ
μ΄λ€.
let sub4: number = 1;
let sup4: any = sub4;
sub4 = sup4;
// sub5 νμ
μ sup5 νμ
μ μλΈ νμ
μ΄λ€.
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() {}
}
// sub6 νμ
μ sup6 νμ
μ μλΈ νμ
μ΄λ€.
let sub6: Dog = new Dog();
let sup6: Animal = sub6;
sub6 = sup6; // error! Property 'eat' is missing in type 'SubAnimal' but required in type
'SubDog'.
1. κ°κ±°λ μλΈ νμ μΈ κ²½μ°, ν λΉμ΄ κ°λ₯νλ€ => 곡λ³
// primitive type
let sub7: string = '';
let sup7: string | number = sub7;
// object - κ°κ°μ νλ‘νΌν°κ° λμνλ νλ‘νΌν°μ κ°κ±°λ μλΈνμ
μ΄μ΄μΌ νλ€.
let sub8: { a: string; b: number } = { a: '', b: 1 };
let sup8: { a: string | number; b: number } = sub8;
// array - object μ λ§μ°¬κ°μ§
let sub9: Array<{ a: string; b: number }> = [{ a: '', b: 1 }];
let sup9: Array<{ a: string | number; b: number }> = sub8;
2. ν¨μμ λ§€κ°λ³μ νμ λ§ κ°κ±°λ μνΌνμ μΈ κ²½μ°, ν λΉμ΄ κ°λ₯νλ€. => λ°λ³
class Person {}
class Developer extends Person {
coding() {}
}
class StartupDeveloper extends Developer {
burning() {}
}
function tellme(f: (d: Developer) => Developer) {}
// Developer => Developer μλ€κ° Developer => Developer λ₯Ό ν λΉνλ κ²½μ°
tellme(function dToD(d: Developer): Developer {
return new Developer();
});
// Developer => Developer μλ€κ° Person => Developer λ₯Ό ν λΉνλ κ²½μ°
tellme(function pToD(d: Person): Developer {
return new Developer();
});
// Developer => Developer μλ€κ° StartipDeveloper => Developer λ₯Ό ν λΉνλ κ²½μ°
tellme(function sToD(d: StartupDeveloper): Developer {
return new Developer();
});
strictFunctionTypes μ΅μ μ μΌλ©΄
ν¨μλ₯Ό ν λΉν μμ ν¨μμ λ§€κ°λ³μ νμ μ΄ κ°κ±°λ μνΌνμ μΈ κ²½μ°κ° μλ κ²½μ°, μλ¬λ₯Ό ν΅ν΄ κ²½κ³ νλ€.
νμ λ³μΉ Type Alias
νμ λ³μΉ (λ³λͺ )
- Interfaceλ λΉμ·ν΄ 보μΈλ€.
- Primitive, Union Type, Tuple, Function
- κΈ°ν μ§μ μμ±ν΄μΌνλ νμ μ λ€λ₯Έ μ΄λ¦μ μ§μ ν μ μλ€.
- λ§λ€μ΄μ§ νμ μ referλ‘ μ¬μ©νλ κ²μ΄μ§ νμ μ λ§λλ κ²μ μλλ€.
Aliasing Primitive
type MyStringType = string;
const str = 'world';
let myStr: MyStringType = 'hello';
myStr = str;
/*
λ³ μλ―Έκ° μλ€..
*/
Aliasing Union Type
let person: string | number = 0;
person = 'Mark';
type StringOrNumber = string | number;
let another: StringOrNumber = 0;
another = 'Anna';
/*
1. μ λμ¨ νμ
μ A λ κ°λ₯νκ³ B λ κ°λ₯ν νμ
2. κΈΈκ² μ°λκ±Έ μ§§κ²
*/
Aliasing Tuple
let person: [string, number] = ['Mark', 35];
type PersonTuple = [string, number];
let another: PersonTuple = ['Anna', 24];
/*
1. νν νμ
μ λ³μΉμ μ€μ μ¬λ¬κ΅°λ°μ μ¬μ©ν μ μκ² νλ€.
*/
Aliasing Function
type EatType = (food: string) => void;
arias interface κ΅¬λΆ μ¬μ©
interface: μ΄λ€ νμ μ΄ κ·Έ νμ μΌλ‘μ¨ λͺ©μ μ΄λΌλκ° μ‘΄μ¬κ°μΉκ° λͺ νν λ μ¬μ©
arias: μ΄λ€ νμ μ΄ κ·Έ νμ μΌλ‘μ¨ λͺ©μ μ΄ λΆλͺ ννλ€λκ° λ³λͺ μΌλ‘μ¨λ§ μ‘΄μ¬ν λ μ¬μ©
'π€ Language > π¦ TypeScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
TS. Alias (λ³μΉ) (2) | 2022.06.20 |
---|---|
μλ°μ€ν¬λ¦½νΈ λμ νμ μ€ν¬λ¦½νΈλ₯Ό ννλ μ΄μ (1) | 2022.06.20 |
TS. μΈν°νμ΄μ€ interface (0) | 2022.03.22 |
TS. Tuple / any / unknown / never / void (0) | 2022.03.14 |
TS. Type / Boolean / Number / String / Symbol / Null & undefined / Object / Array (0) | 2022.03.13 |