์, Typescript ๋ฌธ์์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
์ํํธ์จ์ด์ ์ด์์ ์ธ ์์ฑ์ ํ์ฅ์ ์ด๋ ค ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ฉด ํญ์ ์ ํ ๋ณ์นญ๋ณด๋ค ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ์ง๋ง ์ง์งํ๊ฒ, ํ์ฅ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์ฌ์ฉํ ์๋๊ฐ ์ ํ ์๋ ๋จ์ํ ํ์์ ๋ง๋ค๊ณ ์๋ค๋ฉด ์ธํฐํ์ด์ค๋ก ์ฝ๋ฉํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ฌด์จ ๋ง์์ด์ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ฅ ์์ฒญ์ ๋๊น ์๋๋ฉด ๋ฒ๊ทธ ๋ณด๊ณ ์์ ๋๊น?
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๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๐คฃ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ๊ทธ๊ฒ์ ๋ฌด์ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ถ์ฅ ์ฌํญ์ด ์ฌ๋ฐ๋ฅด์ง ์๋ค๊ณ ๋งค์ฐ ๊ฐํ๊ฒ ๋๋๋๋ค.
์ฌ๊ธฐ ๋ด ๊ฒฌํด๊ฐ ์์ต๋๋ค. ์ ํ ๋ณ์นญ์ ๋ํด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ ๋ ฅํ ์๋ง ์์ต๋๋ค. ๊ถ์ฅ๋๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ค๋ฉด ์ฌ๋ฌ ์ ํ ๋ณ์นญ์ด ์์ ์ ์๋ ํน์ ํด๋์ค ํ์ผ์์ ์ผ๋ถ๋ ์ ํ ๋ณ์นญ์ด ๋๊ณ ์ผ๋ถ๋ ์ธํฐํ์ด์ค๊ฐ ๋ฉ๋๋ค. ์ด ํด๋์ค๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ ๋๊ตฐ๊ฐ๋ ๋๋์ฒด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์ด๋๊ฐ์ ๊ตฌํ/ํ์ฅํ ์๋์ธ์ง, ๋๋ ์ ์ด๋ ๊ทธ๊ฒ์ด ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๊ณ ์๋์ง ๊ถ๊ธํด ํ ๊ฒ์ ๋๋ค.
์ธํฐํ์ด์ค์ ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ํ๋๋ฅผ ๋์ฒดํ๋ ๊ฒ๋ณด๋ค ์ ํ ๋ณ์นญ์ ์ ํ ๋ณ์นญ์ ์ฌ์ฉํ๊ณ ์ธํฐํ์ด์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๊นจ๋ํ ๊ฒ์ ๋๋ค. ์ํ๋ ๋ชจ๋ ๊ฒ์ด ์ ํ ๋ณ์นญ์ธ ๊ฒฝ์ฐ).
ํ์ดํ์คํฌ๋ฆฝํธ ๋ฌธ์์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ฑํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๊ณ , ๊ทธ๋ ๊ฒ ํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๋ฌธ์์์ ํด์ผ ํ๋ค๊ณ ํด์ ๊ท์น์ ๊ตฌํํ๋ ๊ฒ๋ณด๋ค ์ฌ๊ธฐ์ ์ฝ๊ฐ์ ๊ณตํ์ ํ๋จ์ ์ ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.