TypeScriptλ 곡백 μνκ° μλλλ€. JavaScript μνκ³λ₯Ό λ°νμΌλ‘ ꡬμΆλμμΌλ©°, μ€λλ λ§μ JavaScriptκ° μ‘΄μ¬ν©λλ€. JavaScript μ½λ λ² μ΄μ€λ₯Ό TypeScriptλ‘ λ³ννλ κ²μ λ€μ μ§λ£¨νκΈ°λ νμ§λ§ μ΄λ ΅μ§ μμ΅λλ€. μ΄ νν 리μΌμμ μ΄λ»κ² μμνλμ§ μ΄ν΄λ³΄κ² μ΅λλ€. TypeScript μ½λλ₯Ό μμ±νκΈ° μν΄ νΈλλΆμ μΆ©λΆν μ½μλ€κ³ κ°μ νκ³ μ€λͺ νκ² μ΅λλ€.
React νλ‘μ νΈλ₯Ό λ³ννκ³ μ νλ€λ©΄, React λ³ν κ°μ΄λλ₯Ό λ¨Όμ μ½μ΄λ³΄λ κ²μ μΆμ²ν©λλ€.
μΌλ° JavaScriptλ‘ μμ±νλ κ²½μ°, src
, lib
λλ dist
λλ ν°λ¦¬μ μλ .js
νμΌμ΄
JavaScriptλ₯Ό μ§μ μ€νν λ€μ, μνλ λλ‘ μ€ννμ κ°λ₯μ±μ΄ λμ΅λλ€.
μ΄ κ²½μ°, μμ±ν νμΌμ TypeScriptμ μ λ ₯μΌλ‘ μ¬μ©λκ³ , κ·Έλ‘ μΈν μΆλ ₯μ μ€ννκ² λ©λλ€. JSμμ TSλ‘μ μ ννλ λμ, TypeScriptκ° μ λ ₯ νμΌμ κ²Ήμ³ μ°λ κ²μ λ°©μ§νκΈ° μν΄ μ λ ₯ νμΌμ λΆλ¦¬ν νμκ° μμ΅λλ€. λ§μ½ μΆλ ₯ νμΌμ΄ νΉμ λλ ν°λ¦¬μ μμΉν΄μΌ νλ κ²½μ°, κ·Έ μμΉκ° μΆλ ₯ λλ ν°λ¦¬κ° λμ΄μΌ ν©λλ€.
λν JavaScriptμμ λ²λ€λ§μ νκ±°λ λ°λ²¨ κ°μ νΈλμ€νμΌλ¬λ₯Ό μ¬μ©νλ κ²μ²λΌ, μ€κ° λ¨κ³λ₯Ό μ€νν μ μμ΅λλ€. μ΄λ¬ν κ²½μ°, μ΄λ κ² μ€μ λ ν΄λ ꡬ쑰λ₯Ό κ°μ§κ³ μμ μ μμ΅λλ€.
μ΄ μμ λΆν°, λλ ν°λ¦¬κ° λ€μκ³Ό κ°μ΄ μ€μ λμλ€κ³ κ°μ νκ² μ΅λλ€:
projectRoot
βββ src
β βββ file1.js
β βββ file2.js
βββ built
βββ tsconfig.json
λ§μ½ src
λλ ν°λ¦¬ λ°κΉ₯μ tests
ν΄λκ° μ‘΄μ¬νλ€λ©΄, src
μ tests
λ΄λΆμ κ°κ° tsconfig.json
μ΄ μ‘΄μ¬ν μ μμ΅λλ€.
TypeScriptλ μ΄λ€ νμΌμ ν¬ν¨νκ³ , μ΄λ€ μ’
λ₯μ 체ν¬κ° μνλμ΄μΌ νλμ§μ κ°μ νλ‘μ νΈ μ΅μ
μ κ΄λ¦¬νκΈ° μν΄, tsconfig.json
μ΄λΌ λΆλ¦¬λ νμΌμ μ¬μ©ν©λλ€.
νλ‘μ νΈμ λΌλλ₯Ό ꡬμ±ν΄ λ³΄κ² μ΅λλ€:
{
"compilerOptions": {
"outDir": "./built",
"allowJs": true,
"target": "es5"
},
"include": [
"./src/**/*"
]
}
TypeScriptμ λν λͺ κ°μ§ μ¬νμ λͺ μνκ³ μμ΅λλ€:
src
λλ ν°λ¦¬μμ ν΄μλλ λͺ¨λ νμΌμ μ½μ΅λλ€ (include
ν¬ν¨).- JavaScript νμΌμ μ
λ ₯μΌλ‘ νμ©ν©λλ€ (
allowJs
ν¬ν¨). built
λ΄λΆμ λͺ¨λ μΆλ ₯ νμΌμ λ΄λ³΄λ λλ€ (outDir
ν¬ν¨).- μ΅μ JavaScript ꡬμ±μ ECMAScript 5μ κ°μ μ΄μ λ²μ μΌλ‘ λ³νν©λλ€(
target
μ¬μ©).
μ΄ μμ μμ, νλ‘μ νΈμ 루νΈμμ tsc
λ₯Ό μλμν€λ €λ©΄, λ°λμ built
λλ ν°λ¦¬μ μλ μΆλ ₯ νμΌμ΄ νμλμ΄μΌ ν©λλ€.
built
μμ λ μ΄μμ νμΌμ src
μ λ μ΄μμκ³Ό λμΌν΄μΌ ν©λλ€.
μ΄μ νλ‘μ νΈκ° TypeScriptλ‘ μλν κ²μ
λλ€.
TypeScriptκ° νλ‘μ νΈλ₯Ό μ΄ν΄νλ κ²μΌλ‘λΆν° λͺ κ°μ§ ν° ννμ λ°μ μ μμ΅λλ€. VS Code λ Visual Studio μλν°λ₯Ό μ΄μ΄λ³΄λ©΄, μλμμ±κ³Ό κ°μ ν΄λ§ μ§μμ λ°λ κ²μ λ³Ό μ μμ΅λλ€. λν λ€μ μ΅μ μ΄ λ€μ΄ μλ νΉμ λ²κ·Έλ μ‘μ μ μμ΅λλ€:
- ν¨μμ λ§μ§λ§μ returnμ λΉ λ¨λ¦¬λ κ²μ λ°©μ§νλ
noImplicitReturns
- switch λΈλ‘μ
case
μ¬μ΄μbreak
λ₯Ό λΉ λ¨λ¦¬λ κ²μ μ λ μμ§ μκΈ° μνnoFallthroughCasesInSwitch
λν allowUnreachableCode
μ allowUnusedLabels
κ°κ°μ μ¬μ©ν΄, TypeScriptλ λλ¬ν μ μλ μ½λμ λΌλ²¨μ λν κ²½κ³ λ₯Ό ν κ²μ
λλ€.
νμ΄νλΌμΈμ λ λ§μ μ μ λ¨κ³κ° μμ μ μμ΅λλ€. κ°κ°μ νμΌμ 무μΈκ°λ₯Ό μ°κ²°ν μλ μμ΅λλ€. κ°λ³ λΉλ λꡬλ λ€λ₯΄μ§λ§, λΉλ λꡬμ ν΅μ¬μ λ€λ£¨κΈ° μν΄ μ΅μ μ λ€ν κ²μ λλ€.
λ§μ½ Gulpλ₯Ό μ΄λ€ λ°©μμΌλ‘ μ¬μ©νκ³ μλ€λ©΄, TypeScriptμ Gulpλ₯Ό μ¬μ©νλ λ°©λ²κ³Ό Browserify, Babelify, Uglify κ°μ μΌλ°μ μΈ λΉλ ν΄κ³Ό ν΅ν©νλ λ°©λ²μ λν νν 리μΌμ΄ μμ΅λλ€. κ·Έκ³³μμ λ λ§μ λ΄μ©μ λ³Ό μ μμ΅λλ€.
Webpack ν΅ν©μ κ½€ κ°λ¨ν©λλ€.
μ¬μ΄ λλ²κΉ
μ μν΄ source-map-loader
μ κ²°ν©ν TypeScript λ‘λ, awesome-typescript-loader
λ₯Ό μ¬μ©ν μ μμ΅λλ€.
λ¨μν μ€ννκ³
npm install awesome-typescript-loader source-map-loader
λ€μ μ΅μ
μμ webpack.config.js
νμΌκ³Ό λ³ν©νμΈμ:
module.exports = {
entry: "./src/index.ts",
output: {
filename: "./dist/bundle.js",
},
// webpackμ μΆλ ₯μ λλ²κΉ
νκΈ° μν΄ μμ€λ§΅μ νμ±ν ν©λλ€.
devtool: "source-map",
resolve: {
// ν΄μ κ°λ₯ν νμ₯μλ‘ '.ts' μ '.tsx' λ₯Ό μΆκ°ν©λλ€.
extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
},
module: {
loaders: [
// '.ts' λ '.tsx' νμ₯μλ‘ λλλ λͺ¨λ νμΌμ 'awesome-typescript-loader'μ μν΄ μ²λ¦¬λ©λλ€.
{ test: /\.tsx?$/, loader: "awesome-typescript-loader" }
],
preLoaders: [
// λͺ¨λ μΆλ ₯ '.js' νμΌμ 'source-map-loader'μ μν΄ μ¬μ²λ¦¬λ μμ€λ§΅μ κ°μ΅λλ€.
{ test: /\.js$/, loader: "source-map-loader" }
]
},
// λ€λ₯Έ μ΅μ
λ€...
};
awesome-typescript-loaderλ λ€λ₯Έ λ‘λκ° .js
νμΌμ μ²λ¦¬νκΈ° μ μ μ€νλμ΄μΌ νλ€λ μ μ μ μνμΈμ.
μΉ ν©μ μν λ λ€λ₯Έ TypeScript λ‘λ, ts-loaderλ κ°μ΅λλ€. μ¬κΈ°μμ λ μ¬μ΄μ μ°¨μ΄μ μ μ½μ μ μμ΅λλ€.
리μ‘νΈμ μΉ ν© νν 리μΌμμ μΉ ν© μ¬μ©μ κ΄ν μμ λ₯Ό λ³Ό μ μμ΅λλ€.
μ΄μ , TypeScript νμΌμ μ¬μ©ν΄ μμν μ€λΉκ° λμμ κ²μ
λλ€.
첫 λ²μ§Έ λ¨κ³λ .js
νμΌμ .ts
νμΌλ‘ μ΄λ¦μ λ°κΎΈλ κ²μ
λλ€.
νμΌμ΄ JSXλ₯Ό μ¬μ©νλ€λ©΄ μ΄λ¦μ .tsx
λ‘ λ³κ²½νμΈμ.
κ·Έ λ¨κ³λ₯Ό λ§μΉμ ¨λμ? μ’μ΅λλ€! JavaScriptμμ TypeScriptλ‘ νμΌμ μ±κ³΅μ μΌλ‘ λ§μ΄κ·Έλ μ΄μ νμ΅λλ€!
λΉμ°ν, κ·Έκ²μ΄ λ°λ‘ λκ»΄μ§μ§λ μμ κ²μ
λλ€.
TypeScriptλ₯Ό μ§μνλ μλν°λ‘ νμΌμ μ΄μ΄λ³΄λ©΄ (λλ tsc --pretty
λ₯Ό μ€ννλ©΄), νΉμ μ€μ λΉ¨κ° κ΅¬λΆκ΅¬λΆν μ μ΄ λνλ κ²μ
λλ€.
Microsoft Word κ°μ μλν°μ λΉ¨κ° κ΅¬λΆκ΅¬λΆν μ μ²λΌ μκ°νλ©΄ λ©λλ€.
Wordκ° λ¬Έμλ₯Ό μ¬μ ν νλ¦°νΈν μ μλ κ²μ²λΌ, TypeScriptλ μ¬μ ν μ½λλ₯Ό ν΄μν μ μμ΅λλ€.
λ§μ½ κ·Έκ²μ΄ λ무 λμ¨ν΄ 보μΈλ€λ©΄, λ μ격νκ² νλν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, μ€λ₯ λ°μ μ JavaScriptλ₯Ό TypeScriptλ‘ μ»΄νμΌ νμ§ μμΌλ €λ©΄, noEmitOnError
μ΅μ
μ μ¬μ©ν μ μμ΅λλ€.
κ·Έλ¬ν μλ―Έμμ, TypeScriptλ μ΄μμ μΈ μ격ν¨μ κ°κ³ μκ³ , μνλ λ§νΌ κ·Έ κΈ°μ€μ λμΌ μ μμ΅λλ€.
μ΅λν μ격ν μΈν
μ μ¬μ©ν κ³νμ΄λΌλ©΄, μ§κΈ μ€μ νλ κ²μ΄ μ’μ΅λλ€(λ μ격ν 체ν¬νκΈ° μ°Έμ‘°).
μλ₯Ό λ€μ΄, TypeScriptκ° λͺ
μμ μ€λͺ
μμ΄λ νμ
μ any
λ‘ μΆλ‘ νμ§ μκΈ°λ₯Ό μνλ€λ©΄, νμΌμ μμ νκΈ° μ noImplicitAny
λ₯Ό μ¬μ©ν μ μμ΅λλ€.
λ€μ λΆλ΄μ€λ½κ² λκ»΄μ§ μ μμ§λ§, μ₯κΈ°μ μΌλ‘ ν¨μ¬ μ΄λμ
λλ€.
μΈκΈνλ κ²μ²λΌ, μ ν ν μλ¬ λ©μμ§κ° λ¨λ κ²μ μμνμ§ λͺ»νμ΅λλ€. μ€μν μ μ μ€μ λ‘ νλνλμ μ€λ₯λ₯Ό μ΄λ»κ² μ²λ¦¬ν κ²μΈμ§ κ²°μ νλ κ²μ λλ€. μ’ μ’ μ΄κ²μ΄ ν©λ²μ μΈ λ²κ·Έκ° λ μ μμ§λ§, λλλ‘ TypeScriptμκ² λ¬΄μμ λ μνλ €κ³ νλμ§ μ€λͺ ν΄μΌ ν©λλ€.
μμν λ Cannot find name 'require'.
, and Cannot find name 'define'.
κ°μ μλ¬κ° λ§μ΄ λνλ μ μμ΅λλ€.
μ΄λ¬ν κ²½μ°, λͺ¨λμ μ¬μ©ν μ μμ΅λλ€.
μλμ μ μΈμ ν΅ν΄ TypeScriptμκ² μ΄λ¬ν κΈ°λ₯μ΄ μ‘΄μ¬νλ€κ³ λ©λμν¬ μ μμ§λ§
// For Node/CommonJS
declare function require(path: string): any;
λλ
// For RequireJS/AMD
declare function define(...args: any[]): any;
μ΄λ¬ν νΈμΆμ μ κ±°νκ³ importλ₯Ό μν TypeScript ꡬ문μ μ¬μ©νλ κ²μ΄ λ λ«μ΅λλ€.
λ¨Όμ , TypeScript module
νλκ·Έλ₯Ό μ€μ ν¨μΌλ‘μ¨ λͺ¨λ μμ€ν
μ νμ±νν΄μΌ ν©λλ€.
μ ν¨ν μ΅μ
μ commonjs
, amd
, system
, κ·Έλ¦¬κ³ umd
μ
λλ€.
λ§μ½ λ€μκ³Ό κ°μ Node/CommonJS μ½λλ₯Ό κ°κ³ μλ€λ©΄:
var foo = require("foo");
foo.doStuff();
λλ λ€μμ RequireJS/AMD μ½λλ₯Ό κ°κ³ μλ€λ©΄:
define(["foo"], function(foo) {
foo.doStuff();
})
κ·Έλ¬λ©΄ λ€μμ TypeScript μ½λλ₯Ό μμ±ν΄μΌ ν©λλ€:
import foo = require("foo");
foo.doStuff();
λ§μ½ TypeScript importλ‘ μ νμ μμνλ€λ©΄, Cannot find module 'foo'.
κ°μ μ€λ₯κ° λ°μν μ μμ΅λλ€.
μ¬κΈ°μ λ¬Έμ λ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€λͺ
νλ μ μΈ νμΌμ΄ μμ κ°λ₯μ±μ΄ λλ€λ κ²μ
λλ€.
λ€νν ν΄κ²° λ°©λ²μ κ½€ μ½μ΅λλ€.
λ§μ½ TypeScriptκ° lodash
κ°μ ν¨ν€μ§μ λν΄ κ²½κ³ λ₯Ό λ°μμν€λ©΄, κ·Έλ₯ μμ±νλ©΄ λ©λλ€
npm install -S @types/lodash
commonjs
λ§κ³ λ€λ₯Έ λͺ¨λ μ΅μ
μ μ¬μ©νλ€λ©΄, moduleResolution
μ node
λ‘ μ€μ ν΄μΌ ν©λλ€.
κ·Έ ν, lodashλ₯Ό λ¬Έμ μμ΄ import ν μ μκ³ , μ ννκ² μμ±ν μ μμ΅λλ€.
μ νμ μΌλ‘, λͺ¨λμ export νλ κ²μexports
νΉμ module.exports
κ°μ κ°μ νλ‘νΌν°μ μΆκ°νλ κ²μ ν¬ν¨ν©λλ€.
TypeScriptλ μ΅μμ-λ 벨μ export λ¬Έμ νμ©ν©λλ€.
μλ₯Ό λ€μ΄, ν¨μλ₯Ό μ΄λ κ² export νλ€λ©΄:
module.exports.feedPets = function(pets) {
// ...
}
κ·Έκ²μ λ€μκ³Ό κ°μ΄ μμ±ν μ μμ΅λλ€:
export function feedPets(pets) {
// ...
}
λλ‘ exports κ°μ²΄λ₯Ό μμ ν μ¬μμ±ν μ μμ΅λλ€. μλ μμ μ²λΌ μ¦μ νΈμΆνκΈ° μν΄ μ΄λ¬ν νν ν¨ν΄μ μ¬μ©ν©λλ€:
var express = require("express");
var app = express();
μ μλ μ΄λ κ² μμ±νμ μ μμ΅λλ€:
function foo() {
// ...
}
module.exports = foo;
TypeScriptμμ, μ΄κ²μ export =
ꡬ문μ μ¬μ©νμ¬ λͺ¨λΈλ§ ν μ μμ΅λλ€.
function foo() {
// ...
}
export = foo;
λλ‘ λ무 λ§μ/λ무 μ μ μΈμλ₯Ό κ°κ³ μλ ν¨μλ₯Ό νΈμΆν λκ° μμ΅λλ€.
μ νμ μΈ λ²κ·Έμ΄μ§λ§, κ·Έλ¬λ λͺλͺ κ²½μ°, μ΄λ ν 맀κ°λ³μλ₯Ό μ°λ λμ arguments
κ°μ²΄λ₯Ό μ¬μ©νλ ν¨μλ₯Ό μ μΈν μ μμ΅λλ€:
function myCoolFunction() {
if (arguments.length == 2 && !Array.isArray(arguments[1])) {
var f = arguments[0];
var arr = arguments[1];
// ...
}
// ...
}
myCoolFunction(function(x) { console.log(x) }, [1, 2, 3, 4]);
myCoolFunction(function(x) { console.log(x) }, 1, 2, 3, 4);
μ΄ κ²½μ°, TypeScriptλ₯Ό μ¬μ©ν΄μ νΈμΆμμκ² ν¨μ μ€λ²λ‘λλ₯Ό μ¬μ©ν΄ myCoolFunction
μ΄ νΈμΆλλ λ°©λ²μ μλ €μ£Όμ΄μΌ ν©λλ€.
function myCoolFunction(f: (x: number) => void, nums: number[]): void;
function myCoolFunction(f: (x: number) => void, ...nums: number[]): void;
function myCoolFunction() {
if (arguments.length == 2 && !Array.isArray(arguments[1])) {
var f = arguments[0];
var arr = arguments[1];
// ...
}
// ...
}
myCoolFunction
μ μ€λ²λ‘λ μκ·Έλμ² λ κ°λ₯Ό μΆκ°νμ΅λλ€.
첫 λ²μ§Έ κ²μ¬λ myCoolFunction
μ΄ (number
λ₯Ό μΈμλ‘ κ°λ) ν¨μμ number
λ°°μ΄μ κ°μ§λ€λ κ²μ λͺ
μν©λλ€.
λ λ²μ§Έ κ²μ¬λ myCoolFunction
μ΄ λ§μ°¬κ°μ§λ‘ ν¨μλ₯Ό κ°μ§κ³ , λλ¨Έμ§ μ°μ°μ(...nums
)λ₯Ό μ¬μ©νμ¬ κ·Έ μΈμ μΈμλ λͺκ°μ μΈμλ number
κ° λμ΄μΌ ν¨μ λͺ
μν©λλ€.
μ΄λ€ μ¬λλ€μ κ°μ²΄λ₯Ό μμ±νκ³ λ€μκ³Ό κ°μ΄ λμ μΌλ‘ νλ‘νΌν°λ₯Ό μΆκ°νλ κ²μ΄ λ―Έκ΄μ λ 보기 μ’λ€κ³ μκ°ν©λλ€:
var options = {};
options.color = "red";
options.volume = 11;
TypeScriptλ options
μ νλ‘νΌν°κ° μλ {}
λ‘ μΈμνκΈ° λλ¬Έμ color
μ volume
μ ν λΉν μ μλ€κ³ ν κ²μ
λλ€.
λ§μ½ μ μΈμ 리ν°λ΄ κ°μ²΄λ‘ λ³κ²½νλ©΄, μ€λ₯κ° λ°μνμ§ μμ΅λλ€:
let options = {
color: "red",
volume: 11
};
λν options
μ νμ
μ μ μν΄μΌ νκ³ κ°μ²΄ 리ν°λ΄μ λν νμ
λ¨μΈμ μΆκ°ν΄μΌ ν©λλ€.
interface Options { color: string; volume: number }
let options = {} as Options;
options.color = "red";
options.volume = 11;
λμ , options
μ΄ λ¨μν νμ
any
λ₯Ό κ°λλ€κ³ λͺ
μν μ μλλ°, μ΄ λ°©λ²μ κ°μ₯ μ¬μ΄ λ°©λ²μ΄μ§λ§ κ°μ₯ μ μ μ₯μ μ κ°μ§κ³ μμ΅λλ€.
Object
λ λλΆλΆμ κ²½μ° κ°μ₯ μΌλ°μ μΈ νμ
μ΄λ―λ‘, κ°μ΄ μ΄λ€ νλ‘νΌν°λ κ°μ§ μ μλ€κ³ λ§νκΈ° μν΄ Object
λ {}
λ₯Ό μ¬μ©νκ³ μΆμ μ μμ΅λλ€.
νμ§λ§ any
κ° κ°μ₯ μ μ°ν νμ
μ΄λ―λ‘, μ΄λ¬ν κ²½μ°μλ μ€μ λ‘ any
κ° κ°μ₯ μ μ ν νμ
μ
λλ€.
μλ₯Ό λ€μ΄, Object
λ₯Ό νμ
μΌλ‘ μ μΈν κ²½μ° toLowerCase()
κ°μ λ©μλλ₯Ό νΈμΆν μ μμ΅λλ€.
λ μΌλ°μ μΌλ‘ μ¬μ©νλ€λ κ²μ νμ
μΌλ‘ λ μ μ μΌμ ν μ μλ€λ κ²μ μλ―Ένμ§λ§, any
λ μ΄λ€ μΌμ΄λ ν μ μκ² νλ λμμ κ°μ₯ μΌλ°μ μΈ νμ
μ΄λΌλ μ μμ νΉλ³ν©λλ€.
κ·Έκ²μ any
λ₯Ό νΈμΆνκ³ , ꡬμ±νκ³ , νλ‘νΌν°μ μ κ·Όνλ λ±μ μΌμ ν μ μλ€λ κ²μ μλ―Έν©λλ€.
κ·Έλ¬λ any
λ₯Ό μ¬μ©νλ©΄ TypeScriptκ° μ 곡νλ λλΆλΆμ νμ
κ²μ¬μ μλν° μ§μμ λ°μ μ μλ€λ κ²μ λͺ
μ¬νμΈμ.
λ§μ½ Object
μ {}
λ‘ κ²°μ μ΄ λ΄λ €μ§λ©΄, {}
λ₯Ό μ νν΄μΌ ν©λλ€.
μ΄ λμ κ±°μ κ°μ§λ§, νΉμ λν΄ν μν©μμ κΈ°μ μ μΌλ‘ {}
μ΄ Object
λ³΄λ€ λ μΌλ°μ μΈ νμ
μ
λλ€.
TypeScriptλ νλ‘κ·Έλ¨μ λν μμ μ±κ³Ό λΆμμ μ 곡νλ νΉμ ν κ²μ¬λ₯Ό κ°κ³ μμ΅λλ€. TypeScriptλ‘ μ½λλ² μ΄μ€λ₯Ό μμνλ©΄, ν₯μλ μμ μ±μ μν κ²μ¬λ₯Ό νμ±νν μ μμ΅λλ€.
μ΄λ€ νμ
μ΄μ΄μΌ νλμ§ TypeScriptκ° νμ
ν μ μλ κ²½μ°κ° μμ΅λλ€.
μ΅λν μ μ°νκ² λμνκΈ° μν΄, κ·Έ μ리μ any
λ₯Ό μ¬μ©νκΈ°λ‘ κ²°μ ν κ²μ
λλ€.
μ΄κ²μ λ§μ΄κ·Έλ μ΄μ
μλ μ’μ§λ§, any
λ₯Ό μ¬μ©νλ€λ κ²μ λ€λ₯Έ κ³³μμ λ°μ μ μλ μ΄λ ν νμ
μμ μ±κ³Ό ν΄λ§ μ§μλ λ°μ§ λͺ»νλ€λ κ²μ μλ―Έν©λλ€.
TypeScriptκ° μ΄λ° λΆλΆμ νλκ·Έμ μλ¬λ₯Ό λμΈ μ μλλ‘ noImplicitAny
μ΅μ
μ μ¬μ©ν μ μμ΅λλ€.
κΈ°λ³Έμ μΌλ‘, TypeScriptλ null
κ³Ό undefined
μ΄ λͺ¨λ νμ
μ λλ©μΈμ μ‘΄μ¬νλ€κ³ κ°μ ν©λλ€.
number
λ‘ μ μΈλ νμ
μ΄ null
νΉμ undefined
μ΄ λ μ μλ€λ μλ―Έμ
λλ€.
null
κ³Ό undefined
λ JavaScript μ TypeScript μμ λΉλ²ν λ²κ·Έ μμΈμ΄κΈ° λλ¬Έμ, TypeScript μλ μ΄λ¬ν λ¬Έμ μ κ±±μ μ λμ΄μ£Όλ strictNullChecks
μ΅μ
μ΄ μμ΅λλ€.
strictNullChecks
κ° νμ±νλλ©΄, null
κ³Ό undefined
λ κ°κ° null
κ³Ό undefined
λΌλ μ체 μ νμ κ°μ Έμ΅λλ€.
μ΄λ€ κ²μ΄ null
μ΄ λ κ°λ₯μ±μ΄ μλ μν©μμ, μλ νμ
κ³Ό ν¨κ» μ λμΈ νμ
μ μ¬μ©ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, λ§μ½ number
λ null
μ΄ λ μ μλ κ²½μ°, number | null
λ‘ νμ
μ μμ±ν μ μμ΅λλ€.
TypeScriptκ° null
/undefined
λΌκ³ μκ°ν μ μλ κ°μ κ°κ³ μμ§λ§, νμ
μ λν΄ λ μ μκ³ μλ κ²½μ°, νμ μ°μ°μ !
λ₯Ό μ¬μ©ν΄ λ€λ₯΄κ² μ¬μ©ν μ μμ΅λλ€.
declare var foo: string[] | null;
foo.length; // error - 'foo' is possibly 'null'
foo!.length; // okay - 'foo!' just has type 'string[]'
μμΌλ‘, strictNullChecks
λ₯Ό μ¬μ©ν λ, μμ‘΄μ±μ΄ strictNullChecks
λ₯Ό μ¬μ©νλλ‘ μ
λ°μ΄νΈ λμ΄μΌ ν μ μμ΅λλ€.
this
ν€μλλ₯Ό ν΄λμ€ λ°μμ μ¬μ©ν λ, κΈ°λ³Έμ μΌλ‘ any
νμ
μ κ°μ§λλ€.
μλ₯Ό λ€μ΄, Point
ν΄λμ€λ₯Ό μμν΄ λ³΄μΈμ, κ·Έλ¦¬κ³ λ©μλλ‘ μΆκ°νκ³ μΆμ ν¨μλ₯Ό μμν΄λ³΄μΈμ:
class Point {
constructor(public x, public y) {}
getDistance(p: Point) {
let dx = p.x - this.x;
let dy = p.y - this.y;
return Math.sqrt(dx ** 2 + dy ** 2);
}
}
// ...
// Reopen the interface.
interface Point {
distanceFromOrigin(point: Point): number;
}
Point.prototype.distanceFromOrigin = function(point: Point) {
return this.getDistance({ x: 0, y: 0});
}
μμμ μΈκΈ ν κ²κ³Ό κ°μ λ¬Έμ κ° μμ΅λλ€ - getDistance
μ μ² μλ₯Ό ν리기 μ½κ³ μλ¬κ° λ°μνμ§ μμμ΅λλ€.
μ΄λ¬ν μ΄μ λλ¬Έμ, TypeScript μ noImplicitThis
μ΅μ
μ΄ μμ΅λλ€.
μ΄ μ΅μ
μ΄ μ€μ λλ©΄, TypeScriptλ this
κ° λͺ
μμ νμ
μμ΄ μ¬μ©λ λ μλ¬λ₯Ό λ°μμν΅λλ€.
ν΄κ²°μ±
μ μΈν°νμ΄μ€λ ν¨μ μ체μμ λͺ
μμ νμ
μ μ λ¬νκΈ° μν΄ this
-맀κ°λ³μλ₯Ό μ¬μ©νλ κ²μ
λλ€:
Point.prototype.distanceFromOrigin = function(this: Point, point: Point) {
return this.getDistance({ x: 0, y: 0});
}