Tslint: interface-over-type-literal์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 09์›” 25์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: palantir/tslint

์˜ˆ, Typescript ๋ฌธ์„œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด์˜ ์ด์ƒ์ ์ธ ์†์„ฑ์€ ํ™•์žฅ์— ์—ด๋ ค ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋ฉด ํ•ญ์ƒ ์œ ํ˜• ๋ณ„์นญ๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ง„์ง€ํ•˜๊ฒŒ, ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉํ•  ์˜๋„๊ฐ€ ์ „ํ˜€ ์—†๋Š” ๋‹จ์ˆœํ•œ ํ˜•์‹์„ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

API Breaking Change Enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๋‹ค๊ณ  ๋งค์šฐ ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ๊ฒฌํ•ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๋ณ„์นญ์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ์ž…๋ ฅํ•  ์ˆ˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒ์žฅ๋˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋ ค๋ฉด ์—ฌ๋Ÿฌ ์œ ํ˜• ๋ณ„์นญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ํŠน์ • ํด๋ž˜์Šค ํŒŒ์ผ์—์„œ ์ผ๋ถ€๋Š” ์œ ํ˜• ๋ณ„์นญ์ด ๋˜๊ณ  ์ผ๋ถ€๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•œ ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋„๋Œ€์ฒด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด๋”˜๊ฐ€์— ๊ตฌํ˜„/ํ™•์žฅํ•  ์˜๋„์ธ์ง€, ๋˜๋Š” ์ ์–ด๋„ ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์— ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์œ ํ˜• ๋ณ„์นญ์— ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๊นจ๋—ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์œ ํ˜• ๋ณ„์นญ์ธ ๊ฒฝ์šฐ).

ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์„œ์—์„œ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ทœ์น™์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ๊ณตํ•™์  ํŒ๋‹จ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  18 ๋Œ“๊ธ€

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์Šจ ๋ง์”€์ด์‹ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๋Šฅ ์š”์ฒญ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์ž…๋‹ˆ๊นŒ?

Recommended.ts์—์„œ interface-over-type-literal์˜ ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฑฐ์ง“์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ธฐ๋Šฅ ์š”์ฒญ์ธ์ง€ ๋ฒ„๊ทธ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :-)

๊ฒฐ๊ตญ ๊ถŒ์žฅ๋˜๋Š” ์‚ฌ์ „ ์„ค์ •์€ ๋…๋‹จ์ ์ž…๋‹ˆ๋‹ค. ์œ„์— ๊ฒŒ์‹œํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ชจ๋ฒ” ์‚ฌ๋ก€์™€ ์ œ์•ˆ ์‚ฌํ•ญ์ด ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์ „ ์„ค์ •์„ ํ™•์žฅํ•  ๋•Œ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋ฌด์‹œํ•˜๊ณ  ํ•„์š”์— ๋งž๊ฒŒ ๊ตฌ์„ฑ์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๊ทœ์น™์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ์ฃผ ๋ฒ„์ „ ์ด์ „์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋Œ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.


๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด: interface-over-type-literal ๋Š” ์œ ํ˜• ๋ณ„์นญ ์„ ์–ธ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

type Foo = {foo: number}; // The rule disallows this
interface Foo {foo: number} // and fixes it to this

let obj: {foo: number}; // This is still allowed

์œ ํ˜• ๋ณ„์นญ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค๋Š” (๊ฑฐ์˜) ์„œ๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ํ˜• ๋ณ„์นญ์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ์ฐธ๊ณ  ์‚ฌํ•ญ: ์œ ํ˜• ๋ณ„์นญ๊ณผ ๊ฐ™์€ ์ต๋ช… ์œ ํ˜•์ด ๊ณ„์† ์‚ฌ์šฉ๋˜๋„๋ก ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜๋Š” ๋™์•ˆ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์บ์‹œ๋˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ์„ฑ๋Šฅ ๊ฒฉ์ฐจ๋Š” ๋‹ค์Œ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ๋ฒ„์ „์—์„œ ๊ฑฐ์˜ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๋‹ค๊ณ  ๋งค์šฐ ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ๊ฒฌํ•ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๋ณ„์นญ์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ์ž…๋ ฅํ•  ์ˆ˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒ์žฅ๋˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋ ค๋ฉด ์—ฌ๋Ÿฌ ์œ ํ˜• ๋ณ„์นญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ํŠน์ • ํด๋ž˜์Šค ํŒŒ์ผ์—์„œ ์ผ๋ถ€๋Š” ์œ ํ˜• ๋ณ„์นญ์ด ๋˜๊ณ  ์ผ๋ถ€๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•œ ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋„๋Œ€์ฒด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด๋”˜๊ฐ€์— ๊ตฌํ˜„/ํ™•์žฅํ•  ์˜๋„์ธ์ง€, ๋˜๋Š” ์ ์–ด๋„ ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์— ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์œ ํ˜• ๋ณ„์นญ์— ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๊นจ๋—ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์œ ํ˜• ๋ณ„์นญ์ธ ๊ฒฝ์šฐ).

ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์„œ์—์„œ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ทœ์น™์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ๊ณตํ•™์  ํŒ๋‹จ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—๋Š” ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์€ ์ •๋ฐ˜๋Œ€์ด๋ฏ€๋กœ ์ง€์˜ฅ์—์„œ ์ด๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด ์ƒ๊ฐ์— typescript๊ฐ€ ์ž˜๋ชปํ•œ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  typesafe ์–ธ์–ด์˜ ์˜๋ฏธ๊ฐ€ "๋ฉ”์†Œ๋“œ/ํ•จ์ˆ˜/ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์˜ ๋ชจ์Œ"์„ ์˜๋ฏธํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋…์„ ๊ฐœ์ฒด ์„œ๋ช…/๊ณผ ํ˜ผ๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฆฌํ˜•. ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ์€ ๋” ์ œํ•œ์ ์ด์–ด์•ผ ํ•˜๋ฉฐ TSLint ๊ทœ์น™ "interface-must-declare-only-functions" ๋˜๋Š” ๋œ ์ œํ•œ์ ์ธ "interface-must-declare-at-least-one-function"์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ ๊ตฌ์กฐ๋Š” ์œ ํ˜• ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•˜๊ณ  & ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฆ„์€ "T"๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค :-)

@navels ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค tslint:recommended ๋Š” ๋‹ค์Œ ์ฃผ์š” ๋ฒ„์ „์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ด ์ง€๋‚˜์น˜๊ฒŒ ์˜๊ฒฌ์ด ๋งŽ์€ ๊ทœ์น™ ๊ตฌ์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ต์…˜์„ ์–ด๋–ป๊ฒŒ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

tslint.json ์˜ @sibelius "rules" false ํ‘œ์‹œํ•˜์‹ญ์‹œ์˜ค.

{
    "extends": ["tslint:recommended"],
    "rules": {
        "interface-over-type-literal": false
    }
}

์ด ๋ฌธ์ œ๋Š” ๊ถŒ์žฅ ๊ทœ์น™ ์ง‘ํ•ฉ์˜ ๊ทœ์น™ ๋น„ํ™œ์„ฑํ™”๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. TSLint์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ StackOverflow ๋˜๋Š” Gitter๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์—ฌ๊ธฐ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. https://medium.com/@martin_hotell/interface -vs-type-alias-in-typescript-2-7-2a8f1777af4c

๋ฎ์–ด์“ฐ๊ธฐ ๊ทœ์น™์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์‹  ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ์˜ต์…˜์„ ์„ ํ˜ธํ•˜๊ฑฐ๋‚˜ ๋ฐ˜์‘์—์„œ Props ๋˜๋Š” State ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ์˜ต์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ.

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ •๋„๋กœ OOP ์ฝ”๋“œ๋ฅผ ์ ์  ๋” ์ ๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ดˆ๋ณด์ž๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋„›์ง€ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dandrei ์™€ ์ €๋Š” ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(OOP๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ).

์˜ˆ, ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ์ž˜๋ชป๋œ ๊ฒƒ์ด๊ณ  IMO๋Š” ๊ถŒ์žฅ ์‚ฌํ•ญ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ์ž๋™ ์ˆ˜์ •๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋ฏ€๋กœ ์šฐ๋ฆฌ ์œ ํ˜•์„ ๋ฐฉํ•ดํ•˜๊ธฐ ์ „์— ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ถŒ์žฅ ์‚ฌํ•ญ์€ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๋‹ค:

type Foo = {
  foo: string
}

interface IndexedObject {
  [key: string]: string
}

function useIndexedObject(object: IndexedObject) {}

const foo: Foo = {foo: "foo"}
useIndexedObject(foo)

์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. tslint --fix ๊ฐ€ ์ ์šฉ๋˜๊ณ  type Foo ๊ฐ€ interface Foo ๋กœ ๋ณ€๊ฒฝ๋  ๋•Œ๊นŒ์ง€ ๋งˆ์ง€๋ง‰ ์ค„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Argument of type 'Foo' is not assignable to parameter of type 'IndexedObject'.
  Index signature is missing in type 'Foo'.

IMO, ์ฝ”๋“œ๋ฅผ ๊นจ๋Š” ๋ชจ๋“  ๊ทœ์น™์€ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์  ์žฅ, ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ๊ทœ์น™์ด ๋˜์–ด์„œ๋„ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ "์ธํ„ฐํŽ˜์ด์Šค๋Š” 'I'๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ" ๊ทœ์น™์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

error TS2344: ...
Index Signature is missing in type 'SOME INTERFACE'.

๊ทธ๋ž˜์„œ type ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ฑ์— type ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์œผ๋ฉด SOLID ์›์น™ ์œ„๋ฐ˜์˜ ์ข‹์€ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.

#4811์— ๋”ฐ๋ผ Type: Breaking Change ๋ ˆ์ด๋ธ”์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ PR์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋ ‡๋‹ค๋ฉด InterfaceScript๋ผ๋Š” ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•  ๋•Œ TypeScript๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๐Ÿคฃ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰