LHS_EffectiveTypescript_07 - YDP-SPLOUNGE-CLUB/typescript-study GitHub Wiki
์์ดํ 31 ํ์ ์ฃผ๋ณ์ null ๊ฐ ๋ฐฐ์นํ๊ธฐ
strictNullChecks ์ค์ ์ ์ฒ์ ์ผ๋ฉด, null์ด๋ undefined ๊ฐ ๊ด๋ จ๋ ์ค๋ฅ๋ค์ด ๊ฐ์๊ธฐ ๋ํ๋๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ๊ฑธ๋ฌ๋ด๋ if๊ตฌ๋ฌธ์ ์ฝ๋ ์ ์ฒด์ ์ถ๊ฐํด์ผ ํ๋ค๊ณ ์๊ฐํ ์ ์๋ค.
์๋ํ๋ฉด ์ด๋ค ๋ณ์๊ฐ null์ด ๋ ์ ์๋์ง ์๋์ง๋ฅผ ํ์ ๋ง์ผ๋ก๋ ๋ช ํํ๊ฒ ํํํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ด ์ ๋ถ null์ด๊ฑฐ๋ ์ ๋ถ null์ด ์๋ ๊ฒฝ์ฐ๋ก ๋ถ๋ช ํ ๊ตฌ๋ถ๋๋ค๋ฉด, ๊ฐ์ด ์์ฌ์์ ๋๋ณด๋ค ๋ค๋ฃจ๊ธฐ ์ฝ๋ค. ํ์ ์ null์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ธ๋งํ ์ ์๋ค.
// tsConfig: {"strictNullChecks":false}
function extent(nums: number[]) {
let min, max
for (const num of nums) {
if (!min) {
min = num
max = num
} else {
min = Math.min(min, num)
max = Math.max(max, num)
} }
return [min, max]
}
undefined๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๋ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ณ ์ ๋ ๊ถ์ฅํ์ง ์๋๋ค. ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด min๊ณผ max๊ฐ ๋์์ ๋ ๋ค undefined์ด๊ฑฐ๋ ๋ ๋ค undefined๊ฐ ์๋๋ผ๋ ๊ฒ์ ์ ์ ์์ง๋ง, ์ด๋ฌํ ์ ๋ณด๋ ํ์ ์์คํ ์์ ํํํ ์ ์๋ค.
// tsConfig: {"strictNullChecks":true}
function extent(nums: number[]) {
let min, max
for (const num of nums) {
if (!min) {
min = num
max = num
} else {
min = Math.min(min, num)
max = Math.max(max, num)
// ~~~ Argument of type 'number | undefined' is not
// assignable to parameter of type 'number' }
}
return [min, max]
}
extent์ ๋ฐํ ํ์
์ด (null | undefined)[]๋ก ์ถ๋ก ๋์ด์ ์ค๊ณ์ ๊ฒฐํจ์ด ๋ถ๋ช
ํด์ก๋ค.
์ด์ ๋ extent๋ฅผ ํธ์ถํ๋ ๊ณณ๋ง๋ค ํ์
์ค๋ฅ์ ํํ๋ก ๋ํ๋๋ค.
ํ ๊ฐ์ null ์ฌ๋ถ๊ฐ ๋ค๋ฅธ ๊ฐ์ null ์ฌ๋ถ์ ์์์ ์ผ๋ก ๊ด๋ จ๋๋๋ก ์ค๊ณํ๋ฉด ์๋๋ค.
๋ ๋์ ํด๋ฒ์ min๊ณผ max๋ฅผ ํ ๊ฐ์ฒด ์์ ๋ฃ๊ณ null์ด๊ฑฐ๋ null์ด ์๋๊ฒ ํ๋ฉด ๋๋ค.
function extent(nums: number[]) {
let result: [number, number] | null = null
for (const num of nums) {
if (!result) {
result = [num, num]
} else {
result = [Math.min(num, result[0]), Math.max(num, result[1])]
}
}
return result
}
์ด์ ๋ ๋ฐํ ํ์
์ด [number, number] | null์ด ๋์ด์ ์ฌ์ฉํ๊ธฐ๊ฐ ๋ ์์ํด์ก๋ค.
const [min, max] = extent([0, 1, 2])!
const span = max - min // OK
null ์๋ ๋์ ๋จ์ if ๊ตฌ๋ฌธ์ผ๋ก๋ ์ฒดํฌํ ์๋ ์๋ค.
const range = extent([0, 1, 2])
if (range) {
const [min, max] = range
const span = max - min // OK
}
extent์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ค๊ณ๋ฅผ ๊ฐ์ ํ๊ณ , ํ์ ์คํฌ๋ฆฝํธ๊ฐ Null ๊ฐ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ดํดํ ์ ์๋๋ก ํ์ผ๋ฉฐ ๋ฒ๊ทธ๋ ์ ๊ฑฐํ๋ค.
API ์์ฑ ์์๋ ๋ฐํ ํ์ ์ ํฐ ๊ฐ์ฒด๋ก ๋ง๋ค๊ณ ๋ฐํ ํ์ ์ ์ฒด๊ฐ null ์ด๊ฑฐ๋ null์ด ์๋๊ฒ ๋ง๋ค์ด์ผ ํ๋ค. ์ฌ๋๊ณผ ํ์ ์ฒด์ปค ๋ชจ๋์๊ฒ ๋ช ๋ฃํ ์ฝ๋๊ฐ ๋ ๊ฒ์ด๋ค.
ํด๋์ค๋ฅผ ๋ง๋ค ๋๋ ํ์ํ ๋ชจ๋ ๊ฐ์ด ์ค๋น๋์์ ๋ ์์ฑํ์ฌ Null ์ด ์กด์ฌํ์ง ์๋๋ก ํ๋ ๊ฒ์ด ์ข๋ค.
strictNullChecks๋ฅผ ์ค์ ํ๋ฉด ์ฝ๋์ ๋ง์ ์ค๋ฅ๊ฐ ํ์๋๊ฒ ์ง๋ง, null ๊ฐ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ ์ ์ฐพ์๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํ์ํ๋ค.
์์ดํ 32 ์ ๋์จ์ ์ธํฐํ์ด์ค๋ณด๋ค๋ ์ธํฐํ์ด์ค์ ์ ๋์จ์ ์ฌ์ฉํ๊ธฐ
์ ๋์จ ํ์ ์ ์์ฑ์ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง๋ ์ธํฐํ์ด์ค์์๋ ์์ฑ ๊ฐ์ ๊ด๊ณ๊ฐ ๋ถ๋ช ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ ์์ฃผ ๋ฐ์ํ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
์ ๋์จ์ ์ธํฐํ์ด์ค๋ณด๋ค ์ธํฐํ์ด์ค์ ์ ๋์จ์ด ๋ ์ ํํ๊ณ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ดํดํ๊ธฐ๋ ์ข๋ค.
๋ฒกํฐ๋ฅผ ๊ทธ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ ์์ฑ์ค์ด๊ณ , ๊ธฐํํ์ ํ์ ์ ๊ฐ์ง๋ ๊ณ์ธต์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
type FillPaint = unknown
type LinePaint = unknown
type PointPaint = unknown
type FillLayout = unknown
type LineLayout = unknown
type PointLayout = unknown
interface Layer {
layout: FillLayout | LineLayout | PointLayout
paint: FillPaint | LinePaint | PointPaint
}
์ด๋ฐ ์กฐํฉ์ ํ์ฉํ๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ญ์์ด๊ณ ์ธํฐํ์ด์ค๋ฅผ ๋ค๋ฃจ๊ธฐ๋ ์ด๋ ค์ธ ๊ฒ์ด๋ค.
๋ ๋์ ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ธ๋งํ๋ ค๋ฉด ๊ฐ๊ฐ ํ์ ์ ๊ณ์ธต์ ๋ถ๋ฆฌ๋ ์ธํฐํ์ด์ค๋ก ๋ฌ์ผ ํ๋ค.
interface FillLayer {
layout: FillLayout
paint: FillPaint
}
interface LineLayer {
layout: LineLayout
paint: LinePaint
}
interface PointLayer {
layout: PointLayout
paint: PointPaint
}
type Layer = FillLayer | LineLayer | PointLayer
ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ์ด ํ๋ฆ์ ๋ถ์ํ ์ ์๋๋ก ํ์ ์ ํ๊ทธ๋ฅผ ๋ฃ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค. ํ๊ทธ๋ ์ ๋์จ์ ํ์ ์คํฌ๋ฆฝํธ์ ๋งค์ฐ ์ ๋ง๊ธฐ ๋๋ฌธ์ ์์ฃผ ๋ณผ ์ ์๋ ํจํด์ด๋ค.
๋ ๋ค๋ฅธ ์์๋ ํ๊ทธ๋ ์ ๋์จ์ ์๋ก ๋ค ์ ์๋ค.
interface Layer {
type: 'fill' | 'line' | 'point'
layout: FillLayout | LineLayout | PointLayout
paint: FillPaint | LinePaint | PointPaint
}
type: 'fill' ๊ณผ ํจ๊ป LineLaouy๊ณผ PointPaint ํ์ ์ด ์ฐ์ด๋ ๊ฒ์ ๋ง์ด ๋์ง ์๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Layer๋ฅผ ์ธํฐํ์ด์ค์ ์ ๋์จ์ผ๋ก ๋ณํํด๋ณด์.
interface FillLayer {
type: 'fill'
layout: FillLayout
paint: FillPaint
}
interface LineLayer {
type: 'line'
layout: LineLayout
paint: LinePaint
}
interface PointLayer {
type: 'paint'
layout: PointLayout
paint: PointPaint
}
type Layer = FillLayer | LineLayer | PointLayer
type Layer = FillLayer | LineLayer | PointLayer
function drawLayer(layer: Layer) {
if (layer.type === 'fill') {
const { paint } = layer // Type is FillPaint
const { layout } = layer // Type is FillLayout
} else if (layer.type === 'line') {
const { paint } = layer // Type is LinePaint
const { layout } = layer // Type is LineLayout
} else {
const { paint } = layer // Type is PointPaint
const { layout } = layer // Type is PointLayout
}
}
๊ฐ ํ์ ์ ์์ฑ๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ๋๋ก ๋ชจ๋ธ๋งํ๋ฉด ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ฝ๋์ ์ ํ์ฑ์ ์ฒดํฌํ๋ ๋ฐ ๋์์ด ๋๋ค. ๋ค๋ง ํ์ ๋ถ๊ธฐ ํ layer๊ฐ ํฌํจ๋ ๋์ผํ ์ฝ๋๊ฐ ๋ฐ๋ณต๋๋ ๊ฒ์ด ์ด์์ ํด ๋ณด์ธ๋ค.
ํ๊ทธ๋ ์ ๋์จ์ ํ์ ์คํฌ๋ฆฝํธ์ ๋งค์ฐ ์ ๋ง๊ธฐ๋๋ฌธ์ ํ์ํ ๋ ์ ์ฉํ๋๋กํ์.
์์ดํ 33 string ํ์ ๋ณด๋ค ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ์ฌ์ฉํ๊ธฐ
'๋ฌธ์์ด์ ๋จ๋ฐํ์ฌ ์ ์ธ๋' ์ฝ๋๋ฅผ ํผํ๋๋กํ์. ๋ชจ๋ ๋ฌธ์์ด์ ํ ๋นํ ์ ์๋ string ํ์ ๋ณด๋ค๋ ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
string ํ์ ์ ๋ฒ์๋ ๋งค์ฐ ๋๋ค.
interface Album {
artist: string
title: string
releaseDate: string // YYYY-MM-DD
recordingType: string // E.g., "live" or "studio"
}
๋ณ์์ ๋ฒ์๋ฅผ ๋ณด๋ค ์ ํํ๊ฒ ํํํ๊ณ ์ถ๋ค๋ฉด string ํ์ ๋ณด๋ค๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ํ์ ์ ์ ๋์จ์ ์ฌ์ฉํ๋ฉด ๋๋ค. ํ์ ์ฒด์ปค๋ฅผ ๋ ์๊ฒฉํ ํ ์ ์๊ณ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
releaseDate ํ๋๋ Date ๊ฐ์ฒด๋ก ์ฌ์ฉํด์ ๋ ์ง ํ์์ผ๋ก๋ง ์ ํํ๋๊ฒ์ด ์ข๋ค. recordingType ํ๋๋ 'live'์ 'studio' ๋จ ๋ ๊ฐ์ ๊ฐ์ผ๋ก ์ ๋์จ ํ์ ์ ์ ์ํ ์ ์๋ค.
type RecordingType = 'studio' | 'live'
interface Album {
artist: string
title: string
releaseDate: Date
recordingType: RecordingType
}
๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์ ํจ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋๋ string๋ณด๋ค keyof T๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
function pluck<T, K extends keyof T>(record: T[], key: K): T[K][] {
return record.map(r => r[key])
}
pluck(albums, 'releaseDate') // Type is Date[]
pluck(albums, 'artist') // Type is string[]
pluck(albums, 'recordingType') // Type is RecordingType[]
pluck(albums, 'recordingDate')
// ~~~~~~~~~~~~~~~ Argument of type '"recordingDate"' is not
// assignable to parameter of type ...
์ด์๊ฐ์ด keyof T ๋ถ๋ถ์งํฉ์ ํ์ฉํ์ฌ ๊ฐ์ฒด์ ์์ฑ์ ์ ๋๋ก ๋ฐํํ์ ์ด ์ถ๋ก ๋ ์ ์๋ค.
๋ณด๋ค ์ ํํ ํ์ ์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ์ฝ๋์ ๊ฐ๋ ์ฑ๋ ํฅ์์ํฌ ์ ์๋ค.
์์ดํ 34 ๋ถ์ ํํ ํ์ ๋ณด๋ค๋ ๋ฏธ์์ฑ ํ์ ์ ์ฌ์ฉํ๊ธฐ
ํ์ ์์ ์ฑ์์ ๋ถ์พํ ๊ณจ์ง๊ธฐ๋ ํผํด์ผํ๋ค. ํ์ ์ด ์๋ ๊ฒ๋ณด๋ค ์๋ชป๋๊ฒ ๋ ๋์๋ค.
๋ถ์พํ ๊ณจ์ง๊ธฐ
๋ก๋ด ๊ณตํ๊ณผ ์ธ๊ณต ์ง๋ฅ์์ ๋ง์ด ์ฐ์ด๋ ์ฉ์ด ์ด์คํ๊ฒ ์ธ๊ฐ๊ณผ ๋น์ทํ ๋ก๋ด์์ ๋๋ผ๋ ๋ถ์พํจ์ ๋ปํ๋ค. ์ ์์ ์๋๋ ํ์ ์ ์ธ์์ ์ด์คํ๊ฒ ์๋ฒฝ์ ์ถ๊ตฌํ๋ ค๋ค๊ฐ ์คํ๋ ค ์ญํจ๊ณผ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์ฃผ์ํ์๋ ์๋ฏธ์ด๋ค.
ํ์ ์ ์ธ์ ์์ฑํ๋ค ๋ณด๋ฉด ์ฝ๋์ ๋์์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋๋ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ชจ๋ธ๋งํ๊ฒ ๋๋ ์ํฉ์ ๋ง๋ฅ๋จ๋ฆฌ๊ฒ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ์ ์ด ๊ตฌ์ฒด์ ์ผ์๋ก ๋ฒ๊ทธ๋ฅผ ๋ ๋ง์ด ์ก๊ณ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ๊ณตํ๋ ๋๊ตฌ๋ฅผ ํ์ฉํ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ ํ์ ์ ์ธ์ ์ ๋ฐ๋๋ฅผ ๋์ด๋ ์ผ์๋ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค.
์๋ฅผ๋ค์ด ๋ค์์ GeoJSON์ ๊ฐ๊ฐ ๋ค๋ฅธ ํํ์ ์ขํ ๋ฐฐ์ด์ ๊ฐ์ง๋ ํ์ ์ด๋ค.
interface Point {
type: 'Point'
coordinates: number[]
}
interface LineString {
type: 'LineString'
coordinates: number[][]
}
interface Polygon {
type: 'Polygon'
coordinates: number[][][]
}
type Geometry = Point | LineString | Polygon // ๋ค๋ฅธ ๊ฒ๋ค๋ ์ถ๊ฐ๋ ์ ์๋ค.
ํฐ ๋ฌธ์ ๋ ์์ง๋ง ์ขํ์ ์ฐ์ด๋ number[]๊ฐ ์ฝ๊ฐ ์ถ์์ ์ด๋ค.
์ฌ๊ธฐ์ number[]๋ ๊ฒฝ๋์ ์๋๋ฅผ ๋ํ๋ด๋ฏ๋ก ํํ ํ์
์ผ๋ก ์ ์ธํ๋๊ฒ ๋ซ๋ค.
type GeoPosition = [number, number]
interface Point {
type: 'Point'
coordinates: GeoPosition
}
// Etc.
ํ์ ์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋ ๋์ ์ฝ๋๊ฐ ๋ ๊ฒ ๊ฐ๋ค.
์ปค๋ฎค๋ํฐ์ ์๋ํ์ฌ ์ข์์๋ฅผ ๊ธฐ๋ํ์ง๋ง ์ํ๊น๊ฒ๋ ์๋ก์ด ์ฝ๋๊ฐ ๋น๋๋ฅผ ๊นจ๋จ๋ฆฐ๋ค๋ฉฐ ๋ถํํ๋ ์ฌ์ฉ์๋ค์ ๋ชจ์ต๋ง ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
์ฝ๋์๋ ์๋์ ๊ฒฝ๋๋ง์ ๋ช ์ํ์ง๋ง, GeoJSON์ ์์น ์ ๋ณด์๋ ์ธ๋ฒ์งธ ์์์ธ ๊ณ ๋๊ฐ ์์ ์๋ ์๊ณ ๋ ๋ค๋ฅธ ์ ๋ณด๊ฐ ์์ ์๋ ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ ์ ์ธ์ ์ธ๋ฐํ๊ฒ ๋ง๋ค๊ณ ์ ํ์ง๋ง ์๋๊ฐ ๋๋ฌด ๊ณผํ๊ณ ์คํ๋ ค ํ์ ์ด ๋ถ์ ํํด์ก๋ค.
์ ํํ๊ฒ ํ์ ์ ๋ชจ๋ธ๋งํ ์ ์๋ค๋ฉด ๋ถ์ ํํ๊ฒ ๋ชจ๋ธ๋งํ์ง ๋ง์์ผ ํ๋ค. ๋ํ any์ unknown๋ฅผ ๊ตฌ๋ณํด์ ์ฌ์ฉํด์ผ ํ๋ค.
ํ์ ์ ๋ณด๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง๋ค์๋ก ์ค๋ฅ ๋ฉ์์ง์ ์๋์์ฑ ๊ธฐ๋ฅ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค. ์ ํ๋๋ฟ๋ง ์๋๋ผ ๊ฐ๋ฐ ๊ฒฝํ๊ณผ๋ ๊ด๋ จ๋๋ค.
์์ดํ 35 ๋ฐ์ดํฐ๊ฐ ์๋, API์ ๋ช ์ธ๋ฅผ ๋ณด๊ณ ํ์ ๋ง๋ค๊ธฐ
์ฝ๋์ ๊ตฌ์ ๊ตฌ์๊น์ง ํ์ ์์ ์ฑ์ ์ป๊ธฐ ์ํด API ๋๋ ๋ฐ์ดํฐ ํ์์ ๋ํ ํ์ ์์ฑ์ ๊ณ ๋ คํด์ผ ํ๋ค.
๋ฐ์ดํฐ์ ๋๋ฌ๋์ง ์๋ ์์ธ์ ์ธ ๊ฒฝ์ฐ๋ค์ด ๋ฌธ์ ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ณด๋ค๋ ๋ช ์ธ๋ก๋ถํฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข๋ค.
ํ์ผํ์, API, ๋ช ์ธ ๋ฑ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๋ ํ์ ์ค ์ต์ํ ๋ช ๊ฐ๋ ํ๋ก์ ํธ ์ธ๋ถ์์ ๋น๋กฏ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ํ์ ์ ์ง์ ์ฅ์ฑํ์ง ์๊ณ ์๋์ผ๋ก ์์ฑํ ์ ์๋ค.
ํต์ฌ์ ์์ ๋ฐ์ดํฐ๊ฐ์๋๋ผ ๋ช ์ธ๋ฅผ ์ฐธ๊ณ ํด ํ์ ์ ์์ฑํ๋ค๋ ๊ฒ์ด๋ค. ๋ช ์ธ๋ฅผ ์ฐธ๊ณ ํด ํ์ ์ ์์ฑํ๋ฉด ๋์์ ์๋ ๋ฐ์ดํฐ๋ค๋ง ๊ณ ๋ คํ๊ฒ ๋๋ฏ๋ก ์๊ธฐ์น ์์ ๊ณณ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
interface BoundingBox {
lat: [number, number]
lng: [number, number]
}
type GeoJSONFeature = any
function calculateBoundingBox(f: GeoJSONFeature): BoundingBox | null {
let box: BoundingBox | null = null
const helper = (coords: any[]) => {
// ...
}
const { geometry } = f
if (geometry) {
helper(geometry.coordinates)
}
return box
}
Feature ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์๋ ์ ์ด ์๋ค.
๊ทธ๋ฌ๋ ๊ณต์ GeoJSON ๋ช ์ธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ซ๋ค. ๋คํ์ด๋ DefinitelyTyped์๋ ์ด๋ฏธ ํ์ ์คํฌ๋ฆฝํธ ํ์ ์ ์ธ์ด ์กด์ฌํ๋ค.
$npm install --save-dev @types/geojson
# @types/[email protected]
GeoJSON ์ ์ธ์ ๋ฃ๋ ์๊ฐ, ํ์ ์คํฌ๋ฆฝํธ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.
// requires node modules: @types/geojson
interface BoundingBox {
lat: [number, number]
lng: [number, number]
}
import { Feature } from 'geojson'
function calculateBoundingBox(f: Feature): BoundingBox | null {
let box: BoundingBox | null = null
const helper = (coords: any[]) => {
// ...
}
const { geometry } = f
if (geometry) {
helper(geometry.coordinates)
// ~~~~~~~~~~~
// Property 'coordinates' does not exist on type 'Geometry' // Property 'coordinates' does not exist on type // 'GeometryCollection' }
return box
}
API ํธ์ถ์๋ ๋น์ทํ ๊ณ ๋ ค์ฌํญ๋ค์ด ์ ์ฉ๋๋ค. API์ ๋ช ์ธ๋ก๋ถํฐ ํ์ ์ ์์ฑํ ์ ์๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์ข๋ค.
๋ง์ฝ ๋ช ์ธ ์ ๋ณด๋ ๊ณต์ ์คํค๋ง๊ฐ ์๋ค๋ฉด ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์ ์ ์์ฑํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด quicktype ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์์ฑ๋ ํ์ ์ด ์ค์ ๋ฐ์ดํฐ์ ์ผ์นํ์ง ์์ ์ ์๋ค๋ ์ ์ ์ฃผ์ํด์ผ ํ๋ค.