get/set ์ ๊ทผ์๊ฐ ๋์ผํ ์ ํ์ ๊ฐ๋๋ก ์๊ตฌํ๋ ํ์ฌ ์ ์ฝ์ ์ํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
class MyClass {
private _myDate: moment.Moment;
get myDate(): moment.Moment {
return this._myDate;
}
set myDate(value: Date | moment.Moment) {
this._myDate = moment(value);
}
}
ํ์ฌ ์ด๊ฒ์ ๋ถ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
class MyClass {
private _myDate: moment.Moment;
get myDate(): moment.Moment {
return this._myDate;
}
set myDate(value: moment.Moment) {
assert.fail('Setter for myDate is not available. Please use: setMyDate() instead');
}
setMyDate(value: Date | moment.Moment) {
this._myDate = moment(value);
}
}
์ด๊ฒ์ ์ด์์ ์ด์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์ ํ์ด ํ์ฉ๋๋ค๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊นจ๋ํด์ง ๊ฒ์ ๋๋ค.
๊ฐ์ฌ ํด์!
์ฌ๊ธฐ์์ ์ด๊ฒ์ด ์ผ๋ง๋ ์ข์์ง ์ ์ ์์ง๋ง(์ง๊ธ์ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์๋ ์์ง๋ง ์ด์ ์ ์์ฒญํ ์ ์ด ์์) ์ ํธ๋ฆฌํฐ๊ฐ ์ด๋ฅผ ๋ณด์ฆํ๊ธฐ์ ์ถฉ๋ถํ์ง ์ฌ๋ถ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ฌธ์ ๋ ์ ๊ทผ์๊ฐ .d.ts์์ ์ผ๋ฐ ์์ฑ๊ณผ ๋ค๋ฅด๊ฒ ํ์๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ ๊ด์ ์์ ๋ณด๋ฉด ๋์ผํ๊ฒ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. getter์ setter ์ฌ์ด์ ์ฐจ์ด๊ฐ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก a) ๊ตฌํ์ด ๋จ์ผ ์ธ์คํด์ค ๋ฉค๋ฒ๊ฐ ์๋ ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ๋๋ก ์๊ตฌํ๊ณ b) getter์ setter ๊ฐ์ ์ ํ ์ฐจ์ด๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋น ๋ฅธ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค, Dan. ๋ ์ฐ์ํ ๋ฐฉ๋ฒ์ ๋ฐ๋ฅด๊ฒ ์ต๋๋ค. ํ๋ฅญํ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋ค๋ฅธ ์ ํ์ JavaScript getter ๋ฐ setter๋ ์๋ฒฝํ๊ฒ ์ ํจํ๊ณ ํ๋ฅญํ๊ฒ ์๋ํ๋ฉฐ ์ด๊ฒ์ด ์ด ๊ธฐ๋ฅ์ ์ฃผ์ ์ด์ /๋ชฉ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. TypeScript๋ฅผ ๊ธฐ์๊ฒ ํ๊ธฐ ์ํด setMyDate()
๋ฅผ ์ ๊ณตํด์ผ ํ๋ ๊ฒ์ ๊ทธ๊ฒ์ ๋ง์นฉ๋๋ค.
๋ค์ ํจํด์ ๋ฐ๋ฅด๋ ์์ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ ์๊ฐํด ๋ณด์ญ์์ค. .d.ts๋ ๊ณต์ฉ์ฒด ๋๋ any
๋ฅผ ๋
ธ์ถํด์ผ ํฉ๋๋ค.
๋ฌธ์ ๋ ์ ๊ทผ์๊ฐ ์ผ๋ฐ ์์ฑ๊ณผ ๋ค๋ฅด๊ฒ .d.ts์ ํ์๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ด ์ ํ์ด ์์ ๋๊ณ ์ด ๋ฌธ์ ๊ฐ ๊ณ์ ์ด๋ ค ์์ด์ผ ํฉ๋๋ค.
// MyClass.d.ts
// Instead of generating:
declare class MyClass {
myDate: moment.Moment;
}
// Should generate:
declare class MyClass {
get myDate(): moment.Moment;
set myDate(value: Date | moment.Moment);
}
// Or shorter syntax:
declare class MyClass {
myDate: (get: moment.Moment, set: Date | moment.Moment);
// and 'fooBar: string' being a shorthand for 'fooBar: (get: string, set: string)'
}
๋๋ ์ด๊ฒ์ด ๋จ์ง ์๊ฒฌ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง $ a.x = y;
$#$ ์งํ์ a.x === y
๊ฐ true
$๊ฐ ์๋ ๊ฒ๊ณผ ๊ฐ์ setter๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ฑฐ๋ํ ์ํ ์ ํธ์
๋๋ค. ๊ทธ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋น์๋ ์ด๋ค ์์ฑ์ ๋ง๋ฒ์ ๋ถ์์ฉ์ด ์๊ณ ์ด๋ค ์์ฑ์ด ์๋์ง ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?
๋ง๋ฒ ๋ถ์์ฉ์ด ์๋ ์์ฑ๊ณผ ๊ทธ๋ ์ง ์์ ์์ฑ์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?
JavaScript์์๋ ์ง๊ด์ ์ด์ง ์์ ์ ์์ผ๋ฉฐ TypeScript์์๋ ๋๊ตฌ(IDE + ์ปดํ์ผ๋ฌ)๊ฐ ๋ถํํฉ๋๋ค. TypeScript๋ฅผ ๋ค์ ์ข์ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? :)
๋ค๋ฅธ ์ ํ์ JavaScript getter ๋ฐ setter๋ ์๋ฒฝํ๊ฒ ์ ํจํ๊ณ ํ๋ฅญํ๊ฒ ์๋ํ๋ฉฐ ์ด๊ฒ์ด ์ด ๊ธฐ๋ฅ์ ์ฃผ์ ์ด์ /๋ชฉ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ JavaScript๊ฐ ์ฝํ๊ฒ ํ์ํ๋์ด ์์ผ๋ฏ๋ก TypeScript๊ฐ ์ฝํ๊ฒ ํ์ํ๋์ด์ผ ํ๋ค๋ ์ฃผ์ฅ์ ๋๋ค. :-์์ค
์ด๊ฒ์ JavaScript๊ฐ ์ฝํ๊ฒ ํ์ํ๋์ด ์์ผ๋ฏ๋ก TypeScript๊ฐ ์ฝํ๊ฒ ํ์ํ๋์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
C#์ ์ด๋ฅผ ํ์ฉํ๋ฉฐ ์ด ์ธ์ด๋ฅผ ์ฝํ๊ฒ ํ์ํ ํ์ง ์์ต๋๋ค. C#์ ๋ค๋ฅธ ํ์์ get/set์ ํ์ฉํ์ง ์์ต๋๋ค.
C#์ ์ด๋ฅผ ํ์ฉํ๋ฉฐ ์ด ์ธ์ด๋ฅผ ์ฝํ๊ฒ ํ์ํํ์ง ์์ต๋๋ค. C#์ ๋ค๋ฅธ ํ์์ get/set์ ํ์ฉํ์ง ์์ต๋๋ค.
:๋์ง:
์ ๊ทผ์๊ฐ ์ฝํ ์ ํ์ด์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ์ฌ๋์ ์๋ฌด๋ ์์ผ๋ฉฐ ์ ํ์ ์ ์ํ ์ ์๋ ์ ์ฐ์ฑ์ด ์์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
๋ณดํต ์ค๋๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด ์ธ์คํด์ค์ ๋ณต์ฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
get fields(): Field[] {
return this._fields;
}
set fields(value: any[]) {
this._fields = value.map(Field.fromJson);
}
๊ทธ๊ฒ์ ๋์๋ณด๋ค ํจ์ฌ ์ข์ผ๋ฉฐ ๋ด setter๊ฐ ์ ํํ ์ ํ์ ๋ ผ๋ฆฌ setter๋ฅผ ์บก์ํํ ์ ์์ต๋๋ค.
@paulwalker ๊ฑฐ๊ธฐ์์ ์ฌ์ฉํ๋ ํจํด( any
์ ๋ฐ๋ setter์ ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋ฐํํ๋ getter)์ ์ค๋ ์ ํจํฉ๋๋ค.
@danquirk ๋ฐ๊ฐ ์ต๋๋ค, ๊ฐ์ฌํฉ๋๋ค! ST์ฉ IDE ํ๋ฌ๊ทธ์ธ ์ปดํ์ผ๋ฌ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@danquirk ๋์ดํฐ(๋๋ ๋ฒ์ 1.6.2)์ ๋ฐ๋ผ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
http://www.typescriptlang.org/Playground#src =%0A%0Aclass%20Foo%20%7B%0A%0A%20%20get%20items()%3A%20string%5B%5D%20%7B%0A %09%20%20๋ฐํ%20%5B%5D%3B%0A%20%20%7D%0A%20%20%0A%20%20set%20items(value%3A%20any)%20%7B%0A% 09%20%20%0A%20%20%7D%0A%7D
๋ฐฉ๊ธ typescript@next (๋ฒ์ 1.8.0-dev.20151102)๋ก ํ ์คํธํ๋๋ฐ ์ค๋ฅ๋ ์์ต๋๋ค.
~$ tsc --version
message TS6029: Version 1.8.0-dev.20151102
~$ cat a.ts
class A {
get something(): number {return 5;}
set something(x: any) {}
}
~$ tsc -t es5 a.ts
a.ts(2,2): error TS2380: 'get' and 'set' accessor must have the same type.
a.ts(3,2): error TS2380: 'get' and 'set' accessor must have the same type.
์์ด๋ฌ๋ํ๊ฒ๋ Sublime ๋ฆฐํฐ๋ฅผ ์ ๋ฐ์ดํธํ ํ TypeScript 1.7.x๋ฅผ ์ฌ์ฉํ๋ ์ค๋ฅ๊ฐ ๋ ์ด์ ๋ฐ์ํ์ง ์์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด 1.7+์์ ๊ณง ๊ฐ์ ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์์ผ๋ฏ๋ก ์๋ง๋ 1.8.0์ด ํด๋ณดํ์ ๊ฒ์ ๋๋ค.
typescript 1.7.5๋ฅผ ์ง์ํ๋ Visual Studio ์ฝ๋ ๋ฒ์ (0.10.5(2015๋ 12์))๊ณผ ๋ด ์ปดํจํฐ์ ์ ์ญ์ ์ผ๋ก ์ค์น๋ typescript 1.7.5์์๋ ์ฌ์ ํ ๋ฌธ์ ์ ๋๋ค.
๊ทธ๋ผ ์ด๋ค ๋ฒ์ ์ด ์ง์๋ ๊น์?
๊ฐ์ฌ ํด์
๋์ด ์๋ชป ์๊ฐํ ๊ฒ ๊ฐ์์. getter์ setter๋ ๋์ผํ ์ ํ์ด์ด์ผ ํฉ๋๋ค.
์ฐฝํผ. ๊ฐ๋๊ธฐ ํ ์คํธ์ ์ฌ์ฉํ ํ์ด์ง ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ข์ ๊ธฐ๋ฅ์ด ๋์์ ๊ฒ์ ๋๋ค.
๋๋ ๊ฐ๋๊ธฐ ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์์ ๊ฒ์ ๋๋ค:
po.email = "[email protected]";
expect(po.email).toBe("[email protected]");
... ํ์ด์ง ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ:
class PageObject {
get email(): webdriver.promise.Promise<string> {
return element(by.model("ctrl.user.email")).getAttribute("value")
}
set email(value: any) {
element(by.model("ctrl.user.email")).clear().sendKeys(value);
}
}
๊ทธ ์ฝ๋๋ setter๊ฐ any
์ ํ์ด์ด์ผ ํฉ๋๊น?
getter๋ webdriver.promise.Promise<string>
๋ฅผ ๋ฐํํ์ง๋ง setter๋ string
๊ฐ์ ํ ๋นํ๋ ค๊ณ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ ๊ธด ํํ์ ๊ฐ๋๊ธฐ ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋ช ํํด์ง ์ ์์ต๋๋ค.
po.email = "[email protected]";
var currentEmail : webdriver.promise.Promise<string> = po.email;
expect(currentEmail).toBe("[email protected]")
@RyanCavanaugh null ์ฃผ์์ ๋์ ์ผ๋ก null์ ์ฌ์ฉํ์ฌ setter๋ฅผ ํธ์ถํ์ฌ ์ผ๋ถ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ์ ์๋ ์ฝ๋๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
class Style {
private _width: number = 5;
// `: number | null` encumbers callers with unnecessary `!`
get width(): number {
return this._width;
}
// `: number` prevents callers from passing in null
set width(newWidth: number | null) {
if (newWidth === null) {
this._width = 5;
}
else {
this._width = newWidth;
}
}
}
| null
๋ฐ | undefined
๊ฐ ์๋ ๊ฒฝ์ฐ ์ต์ํ ์ ํ์ ๋ค๋ฅด๊ฒ ํ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๊น?
์ด๊ฒ์ ์ ๋ง ์ข์ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ผ ์ด๊ฒ ๊ธฐ๋ฅ์ด ๋ ๊น์?
@artyil ๋ซํ ์๊ณ _By Design_ ํ๊ทธ๊ฐ ์ง์ ๋์ด ํ์ฌ ์ถ๊ฐํ ๊ณํ์ด ์์์ ๋ํ๋ ๋๋ค. ์์ ํํ๋ ์ฐ๋ ค ์ฌํญ์ ๋ฌด์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฐ๋ ฅํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ๋กญ๊ฒ ์ฌ๋ก๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ ์ถ๊ฐ ํผ๋๋ฐฑ์ ํตํด ํต์ฌ ํ์ด ์์ ์ ์ ์ฅ์ ์ฌ๊ณ ํ ์ ์์ต๋๋ค.
@kitsonk ์์ ์๊ฒฌ์์ ์ค๋๋ ฅ ์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์ถฉ๋ถํ ์ ๊ณต๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ๋์์ธ์ ์ด ์ ํ์ด ์๋ ๋๋ถ๋ถ์ ๋ค๋ฅธ ์ ํ ์ธ์ด์ ๊ณตํต ํจํด์ ๋ฐ๋ฅด์ง๋ง Javascript ์ปจํ ์คํธ์์๋ ๋ถํ์ํ๊ณ ์ง๋์น๊ฒ ์ ํ์ ์ ๋๋ค. ์ค๊ณ์ ์ํ ๊ฒ์ด์ง๋ง ์ค๊ณ๊ฐ ์๋ชป๋์์ต๋๋ค.
๋์ํ๋ค.
์ด๊ฒ์ ๋ํด ์ข ๋ ์๊ฐํ ํ. ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ค์ ๋ก ๊ตฌํ์ ๋ณต์ก์ฑ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก @Arnavion ์ ์์ ๊ฐ ๋งค๋ ฅ์ ์ด๋ผ๊ณ โโ์๊ฐํ์ง๋ง ์ค๋๋ ์ ํ ์์คํ ์ getter/setter๋ฅผ ์ผ๋ฐ ์์ฑ์ผ๋ก ์ทจ๊ธํฉ๋๋ค. ์ด๊ฒ์ด ์๋ํ๋ ค๋ฉด ๋ ๋ค ๋์ผํ ๊ฐ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ฝ๊ธฐ/์ฐ๊ธฐ ์ ํ์ ์ง์ํ๋ ๊ฒ์ ํฐ ๋ณํ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์ ํธ๋ฆฌํฐ๊ฐ ๊ตฌํ ๋น์ฉ์ ๊ฐ์น๊ฐ ์๋์ง ํ์ ํ ์ ์์ต๋๋ค.
์ ๋ TypeScript๋ฅผ ์ฌ๋ํ๊ณ ํ์ด ๋ค์ด๋ ๋ชจ๋ ๋
ธ๋ ฅ์ ๊ฐ์ฌํ์ง๋ง(์ ๋ง๋ก, ์ฌ๋ฌ๋ถ์ ๊ธฐ๋ป์!), ์ด ๊ฒฐ์ ์ ์ค๋งํ๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. getFoo()/setFoo()
๋๋ get foo()/set foo()/setFooEx()
์ ๋์๋ณด๋ค ํจ์ฌ ๋ ๋์ ์๋ฃจ์
์ด ๋ ๊ฒ์
๋๋ค.
๊ฐ๋จํ ๋ฌธ์ ๋ชฉ๋ก:
{ get foo(): string | number; set foo(): boolean }
๋ฅผ { foo: boolean | string | number }
$ ์ ํ ๋นํ ์ ์์ต๋๊น? ๋๋ ๊ทธ ๋ฐ๋๋ก๋ ๊ฐ๋ฅํฉ๋๊น?).์์งํ, ๋๋ ์ฌ๊ธฐ์์ ์ฝ๋ ์์ฑ ๋ฐฉ๋ฒ์ ๋ํด ๊ท์ ํ์ง ์์ผ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ์ด ์ฝ๋๊ฐ
foo.bar = "hello";
console.log(foo.bar);
์ ์์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ค๊ณ ์๋ํ๋ ์ธ์ด์์ "hello"
๋ณด๋ค ๋ ๋ง์ ๊ฒ์ ์ธ์ํด์ผ ํฉ๋๋ค. ์์ฑ์ ํ๋์ ์ธ๋ถ ๊ด์ฐฐ์๊ฐ ๊ตฌ๋ถํ ์ ์๋ ๋์์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
@RyanCavanaugh ์ฃผ์ ๋ ์๊ฒฌ์ ๋์ํ๋ ๋์ _might_๋ ๋งค์ฐ TypeScripty์ผ ์ ์๋ค๋ ๋ฐ๋ ์ฃผ์ฅ์ ๋ณผ ์ ์์ต๋๋ค... setter์์ ์ฝํ๊ฒ ์ ํ์ด ์ง์ ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋์ง์ง๋ง ํญ์ ๊ฐ๋ ฅํ ์ ํ์ด ๋ฐํ๋๋ ๊ฒ, ์:
foo.bar = [ '1', 2 ]; // any[]
console.log(foo.bar); // number[]: [ 1, 2 ]
๊ฐ์ธ์ ์ผ๋ก ๋๋ ๋น์ ์ด ๊ทธ๋ ๊ฒ ๋ง๋ฒ์ฒ๋ผ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ง๋ง ์ต์ข ๊ฐ๋ฐ์๊ฐ ๋ฌด์์ด ๊ตฌ๋ถ๋ฌ์ง๊ณ ์ ํ๊ณ ์๋ฆด ๊ฒ์ธ์ง ๋ช ํํ๊ฒ ์ดํดํ ์ ์๋๋ก ๋ฉ์๋๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๋ค์์ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค. API๋ _Autocasting_์ด๋ผ๋ ๊ธฐ๋ฅ์ ๋์ ํ์ต๋๋ค. ์ฃผ์ ์ด์ ์ ์ ํ์ด ์ ์ ์๋ ์์ฑ์ ํ ๋นํ๊ธฐ ์ํด ๊ฐ์ ธ์ฌ ํด๋์ค ์๋ฅผ ์ ๊ฑฐํ ์ ์๋ ๊ฐ์ํ๋ ๊ฐ๋ฐ์ ํ๊ฒฝ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์์ ์์ฑ์ Color
์ธ์คํด์ค ๋๋ rgba(r, g, b, a)
์ ๊ฐ์ CSS ๋ฌธ์์ด ๋๋ 3๊ฐ ๋๋ 4๊ฐ์ ์ซ์ ๋ฐฐ์ด๋ก ํํํ ์ ์์ต๋๋ค. ์์ฑ์ ์ฌ์ ํ Color
์ ์ธ์คํด์ค๋ก ์
๋ ฅ๋ฉ๋๋ค. ๊ฐ์ ์ฝ์ ๋ ์ป๋ ์ ํ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๊ฒ์ ๋ํ ๋ช ๊ฐ์ง ์ ๋ณด: https://developers.arcgis.com/javascript/latest/guide/autocasting/index.html
์ฌ์ฉ์๋ ํ์ํ ๊ฐ์ ธ์ค๊ธฐ ์๋ฅผ ์ค์ฌ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ๋ปค๊ณ ํ ๋น ํ์ ์ ํ์ด ๋ณ๊ฒฝ๋๋ค๋ ์ ์ ์๋ฒฝํ๊ฒ ์ดํดํ๊ณ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ๋ ๋ค๋ฅธ ์: https://github.com/gulpjs/vinyl#filebase
file.base = 'd:\\dev';
console.log(file.base); // 'd:\\dev'
file.base = null;
console.log(file.base); // 'd:\\dev\\vinyl' (returns file.cwd)
๋ฐ๋ผ์ setter๋ string | null | undefined
์ด๊ณ getter๋ string
์
๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ ์ ์์์ ์ด๋ค ์ ํ์ ์ฌ์ฉํด์ผ ํฉ๋๊น? ์ ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ ๋ชจ๋ ๊ณณ์์ ์ธ๋ชจ์๋ null ๊ฒ์ฌ๋ฅผ ์๊ตฌํ ๊ฒ์
๋๋ค. ํ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ์์ฑ์ null
๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค.
getter๊ฐ nullable์ ๋ฐํํ๊ธฐ๋ฅผ ์ํ์ง๋ง setter๊ฐ null์ ์ ๋ ฅ์ผ๋ก ํ์ฉํ์ง ์์์ผ ํ๋ ๋ ๋ค๋ฅธ ์๊ฐ ์์ต๋๋ค.
class Memory {
public location: string;
public time: Date;
public company: Person[];
}
class Person
{
private _bestMemoryEver: Memory | null;
public get bestMemoryEver(): Memory | null { // Might not have one yet
return this._bestMemoryEver;
}
public set bestMemoryEver(memory: Memory) { // But when he/she gets one, it can only be replaced, not removed
this._bestMemoryEver = memory;
}
}
var someDude = new Person();
// ...
var bestMemory: Memory | null = someDude.bestMemoryEver;
//...
someDude.bestMemoryEver = null; // Oh no you don't!
null์ ๋ํด getter/setter๋ฅผ ๋ค๋ฅด๊ฒ ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ํน๋ณํ ๋ ผ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ๋๋ฌด ๋ง์ ์์ ์ผ ์ ์๋ค๋ ๊ฒ์ ์ดํดํ๊ณ , ๋์๊ฒ๋ ๊ทธ๋ ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ์๋์ง๋ง ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
@Elephant-Vessel ์ฒ ํ์ ์ผ๋ก ๋๋ ์ด ์๋ฅผ ์ ๋์ ์ผ๋ก ์ข์ํฉ๋๋ค. ์ธ๊ฐ์ ๋ณ๋์ค๋ฌ์ด ๋ณธ์ฑ์ ์ ๋ํ๋ด์ง null
(๋๋ undefined
)์ ์ค์ ํฉ๋๋ค. ์์คํ
์์ ์๋
์ค ์ฅ์ ๋ฅผ ์ด๋ป๊ฒ ๋ชจ๋ธ๋งํ ์ ์์ต๋๊น?
@aluanhaddad ์ ์๋ ์ค ์คํจ๋ฅผ ์ํฉ๋๊น? ๋๋ ๋ด ์ฐ์ฃผ์์ ๊ทธ๋ฐ ์ข ๋ฅ์ ๋์ ๊ฒ์ ์ํ์ง ์์ต๋๋ค ;)
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? null ๋๋ undefined๋ก ์ค์ ๋ ๋ ๊ธฐ๋ณธ๊ฐ ์ ๊ฐ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
๋๋ ์๋น์๊ฐ ์ฌ์ ์ null ์ฒดํฌ๋ฅผ ํ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ํ์ฌ๋ ๋์ setter๋ฅผ ๋ณ๋์ ๋ฉ์๋๋ก ๋ง๋ค์ด์ผ ํ๋๋ฐ ๋์ผํ๊ฒ ํ๊ณ ์ถ์ต๋๋ค.
๋ค์์ ๋ด๊ฐ ๊ฐ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
export class TestClass {
private _prop?: number;
get prop(): number {
// return default value if not defined
this._prop === undefined ? 0 : this._prop;
}
set prop(val: number | undefined) {
this._prop = val;
}
}
Null์ด ์๋ ๊ฒ์ฌ์ ์ด์ ์ ๋ฌธ์ ์ ํจ๊ป ์ ๊ณต๋๋ฉฐ ์ด๊ฒ์ด ๊ทธ ์ค ํ๋์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์๊ฒฉํ null ๊ฒ์ฌ๋ฅผ ๋๋ฉด ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง null ์ฐธ์กฐ ์์ธ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์ปดํ์ผ๋ฌ์ ๋์์ ๋ฐ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ปดํ์ผ๋ฌ ์ง์์ ์ํ๋ค๋ฉด ์ต์ํ null ํ์ฉ ์ฌ๋ถ์ ๊ด๋ จํ์ฌ getter ๋ฐ setter์ ๋ํ ๋ณ๋์ ์ ์๋ฅผ ๊ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ ๋ง์ ์ง์์ด ์ ๊ณต๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌธ์ ์ ๋ ์ด๋ธ์ ์ด๊ฒ์ด ์ค๊ณ ์ ํ์ด๋ฉฐ ๊ตฌํ์ด ๋๋ฌด ๋ณต์กํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์์ ๋ํ๋ ๋๋ค. ์ด๋ ๋ณธ์ง์ ์ผ๋ก ๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ด ์ฌ์ค์ด์ด์ผ ํ๋ ๋งค์ฐ ๊ฐ๋ ฅํ ์ด์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ฌด๋ฐ๋ ๊ฐ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
@mhegazy @kitsonk ํธ๊ฒฌ์ด ์์ ์ ์์ง๋ง, ์ด๊ฒ์ ํนํ ์์ง null ๊ฒ์ฌ๊ฐ ์๋ ์ธ์ด์ ๊ฐ์ ๋ค๋ฅธ ์ค๊ดํธ์์ ์ผ๋ฐ์ ์ธ ํจํด์ ๋ํ ์๊ฒฉํ null ๊ฒ์ฌ๋ฅผ ์ํด ๋ฐ์ํ ๋ฒ๊ทธ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋น์๊ฐ ๊ฐํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ค์ ๋ก null์ด ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค(๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ์ฌ null์ด ๋์ง ์๋๋ค๋ ์ ).
์ด๊ฒ์ ๊ธฐ์ ์ ์ผ๋ก ๋ค๋ฅธ ์ ํ์ด๊ธฐ ๋๋ฌธ์ ์๊ฒฉํ null ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. ๋๋ ๊ฐ๋ ฅํ ๋ค๋ฅธ ์ ํ์ ์ค์ ํ๋๋ก ์๊ตฌํ์ง ์์ง๋ง ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋์์ธ ์๊ตฌ ์ฌํญ์ ๊ฐ๋ ฅํ ๋ค๋ฅธ ์ ํ๋ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
null ๋ฐ undefined์ ๊ฐ์ ์ ํ์ด ์์ ํ ๋ค๋ฅธ ์ ํ์ ํ์ฑํํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค ์ ์ ๋ฐ d.ts ํ์ผ์ ๋ํด ํน์ํ ๊ฒฝ์ฐ๊ฐ ๋๋๋ก ์ฝํ ์ ํ์ ๋์ฒด ๋์์ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
https://github.com/Microsoft/TypeScript/issues/2521#issuecomment -199650959์ ๋ํ ์๋ต์ผ๋ก
๊ตฌํํ๊ธฐ๊ฐ ๋ ๋ณต์กํด์ผ ํ๋ ์ ์ ๋์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export interface Test {
undefset prop1: number; // property [get] type number and [set] type number | undefined
nullset prop2: number; // property [get] type number and [set] type number | null
nilset prop3: number; // property [get] type number and [set] type number | null | undefined
undefget prop4: number; // property [get] type number | undefined and [set] type number
nullget prop5: number; // property [get] type number | null and [set] type number
nilget prop6: number; // property [get] type number | null | undefined and [set] type number
}
TypeScript์ ํจ์ฌ ๋ ์ต์ํ ์ด ์ค๋ ๋๋ฅผ ๋ณด๊ณ ์๋ ์ฌ๋๋ค์ด ์๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ์ฌ์ ํ ๊ด์ฌ์ ๊ฐ๊ณ ์๋ ๋๊ตฐ๊ฐ๊ฐ ๊ด๋ จ ์ง๋ฌธ์ ๋ต๋ณํ ์ ์์ต๋๋ค. ์ด Cesium ๋ฌธ์ ์์ ์ ๋ ์ฌ๊ธฐ์ ๋ ผ์ํ๊ณ ์๋ get/set ์ ํ ์ ํ์ ๋ํด ์ธ๊ธํ์ผ๋ฉฐ Cesium ์ฌ๋๋ค์ ๊ทธ๋ค์ด ๋ฐ๋ฅด๊ณ ์๋ ํจํด์ด C#์์ ์จ ๊ฒ์ด๋ผ๊ณ ๋งํ์ต๋๋ค -- ์ด๊ฒ์ ์์์ ์์ฑ์ ์ ๋๋ค.
TypeScript๊ฐ ์์์ ์์ฑ์๋ฅผ ์ง์ํ ์ ์์ต๋๊น? ์ฆ, myThing.foo
๋ ํญ์ Bar
Bar
๋ฅผ ์ง์ ํ ๋นํ ์ ์์ง๋ง number
๋ฅผ ํ ๋นํ ์๋ ์์ต๋๋ค. ๊ฐ๋ฐ์์ ํธ์๋ฅผ ์ํด Bar
์ ์กฐ์ฉํ ๋ํ/์ด๊ธฐํํ๋ ๋ฐ ์ฌ์ฉํ์๊ฒ ์ต๋๊น? Bar
์ฃผ์์ ๋ฌ๊ฑฐ๋ " number
is assignable to Bar<number>
"๋ผ๊ณ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ๋ฉด Cesium ๋ฌธ์ ์์ ๋
ผ์๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ค๋ ๋์์ ์ ๊ธฐ๋ ๋ง์ ๋ฌธ์ ๋ค.
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ณ๋์ ๋ฌธ์ ์์ ์์์ ์์ฑ์ ์ง์์ ์ ์ํด์ผ ํฉ๋๊น?
๊ทธ๊ฒ์ ๋ํด ๋ ๋ง์ด ์๊ฐํ๊ฑฐ๋ ์ฝ์์๋ก "์์์ ์์ฑ์ ํจํด"์ ์ด ํธ์์ ์ค๋ช
ํ๋ ๊ธฐ๋ฅ์ด ํ์ํ๋ค๋ ํ์ ์ด ๋ ๋ง์ด ๋ญ๋๋ค. ๋ฐ๋๋ผ JS์์ ๊ฐ๋ฅํ ์ ์ผํ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด get/set ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ๋ช
๋ชฉ ํ ๋น( =
์ฐ์ฐ์)์ด ์ค์ ๋ก ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ํธ์ถํ๋ ์ ์ผํ ์๊ฐ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. (๋ง๋?) ๊ทธ๋์ ์ฐ๋ฆฌ์๊ฒ ์ ๋ง ํ์ํ ๊ฒ ๊ฐ์
class MyThing{
set foo(b: Bar<boolean> | boolean);
get foo(): Bar<boolean>;
}
@RyanCavanaugh ๊ฐ "์ ์ ์ ์ ์๋ฏธ๋ก "์ด ์๋๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๊ฐ๋จํ ์ฌ์ค์ ์ด ํจํด์ ์ฌ์ฉํ๋ ๊ฝค ์ธ๊ธฐ ์๋ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ผ๋ฉฐ ์ฃผ์ด์ง ๊ธฐ์กด TS ์ ์ฝ ์กฐ๊ฑด์ ์ค๋ช ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ง๋ ์๋๋ผ๋ ์ด๋ ค์ด ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ด๊ฐ ํ๋ ธ์ผ๋ฉด ์ข๊ฒ ์ด.
JavaScript๋ ์ด๋ฏธ ์ค๋ช
ํ๋ ํจํด์ ํ์ฉํฉ๋๋ค. _challenge_๋ TypeScript์์ ์ ํ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์ธก๋ฉด์ด ์ค๊ณ์ ๋์ผํ ๊ฒ์ผ๋ก ๊ฐ์ ๋๋ค๋ ๊ฒ์
๋๋ค. ํ ๋น์ ํ์ฉํ์ง ์๋ ์ธ์ด ์์ ( readonly
)์ด ์์์ง๋ง _์ฐ๊ธฐ ์ ์ฉ_ ๊ฐ๋
์ ์์ฒญํ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด ๊ฐ๋
์ ์ค์ ๊ฐ์น์ ๋นํด ๋๋ฌด ๋ณต์กํ๋ค๊ณ ๋
ผ์๋์์ต๋๋ค.
IMO, JavaScript๊ฐ ์ ๊ทผ์๋ฅผ ํ์ฉํ ์ดํ๋ก ์ฌ๋๋ค์ ์ ์ฌ์ ์ผ๋ก ๊ทธ๋ค๊ณผ ํผ๋๋๋ API๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ํ ๋น๋ ๊ฒ์ด _๋ง์ ์ ์ผ๋ก_ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ํผ๋์ค๋ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์์ ์ธ ๋ชจ๋ ๊ฒ, ํนํ ์ ํ ๋ณํ์ JavaScript IMO์ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ ๋๋ค. ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ ๋ฐ๋ก ์ ์ฐ์ฑ์ ๋๋ค. _magic_์ด ์๋ ์ด๋ฌํ ์ ํ์ ๋ณํ์์๋ ๊ฐ์ธ์ ์ผ๋ก ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ฌ๊ธฐ์ ์ผ์ข ์ โจ๊ฐ ๋ฐ์ํ๊ณ ๊ฐ์ ๊ฒ์ํ๊ธฐ ์ํด ์ฝ๊ธฐ ์ ์ฉ getter๋ฅผ ๋ง๋๋ ๊ฒ์ด ์๋น์์๊ฒ ์ข ๋ ๋ช ์์ ์ ๋๋ค.
์ด๋ ์ค์ ์ฌ์ฉ์ด ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ์ง ์์ผ๋ฉฐ, ์ด๋ ์ ์ฌ์ ์ผ๋ก ์ ์ ์ ์ด๊ณ ํฉ๋ฆฌ์ ์ ๋๋ค. ์ ์ฒด ์ ํ ์์คํ ์ ๋ ๊ฐ๋ก ๋ถํ ํ๋ ๋ณต์ก์ฑ ๋๋ฌธ์ ์ ํ์ด ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์กฐ๊ฑด์์ ์ถ์ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋งค์ฐ ์ฌ์ํ์ง ์์ ์๋๋ฆฌ์ค์ฒ๋ผ ๋ณด์ ๋๋ค.
๋๋ :sparkles: here์ ๋์ํฉ๋๋ค. ํ์ง๋ง ํจํด ์ฌ์ฉ์ ๋ํด ์ฐฌ์ฑํ๊ฑฐ๋ ๋ฐ๋ํ๋ ๊ฒ์ด ์๋๋๋ค. ๋จ์ง ์ด๋ฏธ ํจํด์ ์ฌ์ฉ ํ๊ณ ํจํด์ ๋ชจ์์ ์ค๋ช ํ๋ ์ฝ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ค๊ณ ํ ๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ ์ด๋ฏธ ์๋ํ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ฉฐ TS๋ ์ด๋ฅผ ์ค๋ช ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
์ข๋ ๋์๋ JS๋ ํ ๋น์ ํจ์ ํธ์ถ๋ก ๋ฐ๊ฟ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ผ๋ฉฐ ์ฌ๋๋ค์ ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. set/get
์์ ๋ค๋ฅธ ์ ํ์ ํ ๋นํ ์ ์๋ ๊ธฐ๋ฅ์ด ์๋๋ฐ ์ ์ฐ๋น์ธํธ ํ์ดํ์ set/get
๊ฐ ์์ต๋๊น? Salsa๋ myThing.foo
๊ฐ ํ ๋น์ ์ด๋ ์ชฝ์ ์๋์ง์ ๊ด๊ณ์์ด ํญ์ ๋จ์ผ ์ ํ์ ๋ฉค๋ฒ ๋ณ์๋ก ์ฒ๋ฆฌํ๋ ค๋ ๊ฒฝ์ฐ ์์ฑ์ด getter ๋ฐ setter๋ก ๊ตฌํ๋๋ค๋ ๊ฒ์ ์ ํ์๊ฐ ์์ต๋๋ค. (๋ฌผ๋ก ์ค์ TypeScript ์ปดํ์ผ์ ์์ ํ ๋ค๋ฅธ ๊ฒ์
๋๋ค.)
@thw0rted
TypeScript์ ํจ์ฌ ๋ ์ต์ํ ์ด ์ค๋ ๋๋ฅผ ๋ณด๊ณ ์๋ ์ฌ๋๋ค์ด ์๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ์ฌ์ ํ ๊ด์ฌ์ ๊ฐ๊ณ ์๋ ๋๊ตฐ๊ฐ๊ฐ ๊ด๋ จ ์ง๋ฌธ์ ๋ต๋ณํ ์ ์์ต๋๋ค. ์ด Cesium ๋ฌธ์ ์์ ์ ๋ ์ฌ๊ธฐ์ ๋ ผ์ํ๊ณ ์๋ get/set ์ ํ ์ ํ์ ๋ํด ์ธ๊ธํ์ผ๋ฉฐ Cesium ์ฌ๋๋ค์ ๊ทธ๋ค์ด ๋ฐ๋ฅด๋ ํจํด์ด C#์์ ์จ ๊ฒ์ด๋ผ๊ณ ๋งํ์ต๋๋ค -- ์ด๊ฒ์ ์์์ ์์ฑ์์ ๋๋ค.
C#์ ์์์ ์ฌ์ฉ์ ์ ์ ๋ณํ ์ฐ์ฐ์๋ ๊ฐ ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ์ฝ๋ ์์ฑ์ ์ํํฉ๋๋ค. TypeScript ์ ํ์ ์ง์์ง๊ณ ๋ฐํ์ ๋์์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค($ Promise
ํด๋ฆฌํ๋ฌ์ ๊ฒฝ์ฐ async
/ await
#$ ์์ธ ์ผ์ด์ค๋ ๊ฒฌ๋ ์ ์์).
@kitsonk ์์ฑ๊ณผ ๊ด๋ จํ์ฌ ์ผ๋ฐ์ ์ผ๋ก ๋์ํ์ง ์์ต๋๋ค. Java, C++ ๋ฐ C#์ ์ฌ์ฉํ์ฌ ์๋นํ ์๊ฐ์ ๋ณด๋์ง๋ง ์ค์ํ ๊ตฌ๋ฌธ ์ถ์ํ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์์ฑ(C#์์ ๋ณผ ์ ์์)์ ์ ๋์ ์ผ๋ก ์ข์ํฉ๋๋ค(JavaScript์์๋ ๋ค์ ์ฌ์ค์). ์ด๋ฅผ ํตํด ์ธํฐํ์ด์ค๋ ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์๋ฏธ ์๋ ๋ฐฉ์์ผ๋ก ์ฝ๊ธฐ/์ฐ๊ธฐ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค. ๋๋ X
๋ฅผ ์ป๋ ๊ฒ์ด ์์์ ์ผ ์ ์์ ๋ getX()
์ ๊ฐ์ ์ฌ์ํ ์์
์ ๋์ฌ๊ฐ ๋ญ๋น๋๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ์ซ์ดํฉ๋๋ค.
IMO์ ํผ๋์ค๋ฌ์ด API๋ ์ ๊ทผ์๋ฅผ ๋จ์ฉํ๋ค๊ณ ํ๋ ๊ฒ์ฒ๋ผ ๋๋ฌด ๋ง์ _setters_๊ฐ ๋ง๋ฒ ๊ฐ์ ์ผ์ ํ๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ด ๋ฐ์ํฉ๋๋ค.
์ฝ๊ธฐ ์ ์ฉ์ด์ง๋ง ์ผ๋ถ ๋ฐ์ดํฐ์ ๋ํ ๋ผ์ด๋ธ ๋ทฐ(์: registry
)๊ฐ ์๋ ๊ฒฝ์ฐ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ์ดํดํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.
interface Entry {key: string; value: any;}
export function createRegistry() {
let entries: Entry[] = [];
return {
register(key: string, value: any) {
entries = [...entries, {key, value}];
},
get entries() {
return [...entries];
}
}
}
const registry = createRegistry();
registry.register('hello', 'ๆจๅฅฝ');
console.log(registry.entries); //[{key: 'hello', value: 'ๆจๅฅฝ'}]
registry.register('goodbye', 'ๅ่ง');
console.log(registry.entries); //[{key: 'hello', value: 'ๆจๅฅฝ'}, {key: 'goodbye', value: 'ๅ่ง'}]
์ ์ ์ ๋ํด ๋ฏธ์ํ์ง๋ง ๋๋ ์ด๊ฒ์ ๋ํ ์ ๊ทผ์๋ฅผ ์ข์ํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๊บผ์ด ํ์ ํ๊ณ ๊ฐ๋ ์ฑ์ด ๋์ ์ฒซ ๋ฒ์งธ ๊ด์ฌ์ฌ์ ๋๋ค.
TypeScript๊ฐ JavaScript๋ฅผ ์ ํํ๋ฉด ์ด์ ๋ณด๋ค ์ฑ๊ฐ์ ๊ฒ์ด ๋ ๋ง์ต๋๋ค. TypeScript๋ ๊ฐ๋ฐ์๊ฐ ์๋ก ์์ฌ ์ํตํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ด ์๋๊ฐ์?
๋ํ ์ธํฐ๋ฅผ ๋ฎคํ ์ดํฐ๋ผ๊ณ ๋ถ๋ฅด๋ ๋ฐ๋ ์ด์ ๊ฐ ์์ต๋๋ค. ์ด๋ค ์ข ๋ฅ์ ๋ณํ๋ ํ์ํ์ง ์๋ค๋ฉด setter๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ง์ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ฅผ typescript๋ก ํฌํ . ๋๋์ด ๋ฌธ์ ๋ฅผ ๋ง๋ฌ๋ค..
์ด๊ฒ์ ๊ฐ๋ @Input ๋ฐ์ฝ๋ ์ดํฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฐ์ด ํ ํ๋ฆฟ์์ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ค์ด์ค๋ ๊ฐ์ฒด ์ ํ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๊น๋ํด์ง๋๋ค.
์ ๋ฐ์ดํธ: ์ด๊ฒ์ ๋๋ฅผ ์ํด ์๋ํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
import { Component, Input } from '@angular/core';
import { flatMap, isString, isArray, isFalsy } from 'lodash';
@Component({
selector: 'app-error-notification',
templateUrl: './error-notification.component.html',
})
export class ErrorNotificationComponent {
private _errors: Array<string> = [];
constructor() { }
/**
* 'errors' is expected to be an input of either a string or an array of strings
*/
@Input() set errors(errors: Array<string> | any){
// Caller just passed in a string instead of an array of strings
if (isString(errors)) {
this._errors = [errors];
}
// Caller passed in array, assuming it is a string array
if (isArray(errors)) {
this._errors = errors;
}
// Caller passed in something falsy, which means we should clear error list
if (isFalsy(errors)) {
this._errors = [];
}
// At this point just set it to whatever might have been passed in and let
// the user debug when it is broken.
this._errors = errors;
}
get errors() {
return this._errors;
}
}
์ฐ๋ฆฌ๋ ๊ทธ๋ฌ๋์? setter์ getter๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ ํ์ ๋ฐํํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ ๋ง๋ก ๊ฐ๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค์ด:
class Field {
private _value: string;
get value(): string {
return this._value;
}
set value(value: any) {
this._value = String(value);
}
}
์ด๊ฒ์ ๋ค์ดํฐ๋ธ ๊ตฌํ์ 99%๋ฅผ ์ํํ๋ ๊ฒ์
๋๋ค( (input as HTMLInputElement).value
์ ์ซ์๋ฅผ ์ ๋ฌํ๋ฉด ํญ์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. ์ฌ์ค get ๋ฐ set ์ ๋ฉ์๋๋ก ๊ฐ์ฃผ๋์ด์ผ ํ๋ฉฐ ์ผ๋ถ๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค.
set value(value: string);
set value(value: number);
set value(value: any) {
this._value = String(value);
}
// AND/OR
set value(value: string | number) {
this._value = String(value);
}
@raysuelzer , ์ฝ๋๊ฐ "์๋"ํ๋ค๊ณ ๋งํ ๋ ErrorNotificationComponent.errors
๋ Array<string> | any
์ ํ์ ๋ฐํํ์ง ์์ต๋๊น? ์ฆ, ์ค์ ๋ก Array<string>
๋ฐํํ ์ ์๋ค๋ ๊ฒ์ ์ ๋ ์ฌ์ฉํ ๋๋ง๋ค ์ ํ ๊ฐ๋๊ฐ ํ์ํฉ๋๋ค.
@lifaon74 , ๋ด๊ฐ ์๋ ํ ์ด ๋ฌธ์ ์ ๋ํ ์์ง์์ด ์์ต๋๋ค. ์ฌ๋ฌ ์๋๋ฆฌ์ค๊ฐ ์ ์๋๊ณ ์ด๋ก ์ธํด Typescript์์ ์ ์ ํ๊ฒ ์ค๋ช ํ ์ ์๋ ์๋ง์ ๋ ๊ฑฐ์ JS ์ฝ๋๊ฐ ์ ์๋์์ง๋ง ๋ฌธ์ ๋ ์ข ๊ฒฐ๋์์ต๋๋ค. ํ์ฅ์ ์ฌ์ค์ด ๋ฌ๋ผ์ก๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์๋ก์ด ์ฌ์ค์ ์ฌ๋ ๊ฒ์ด ์ข์๊น์? ๋๋ ์ค๋๋ ์ฃผ์ฅ์ ๋ค์ ์ฝ๋ ๊ฒ์ ๋ํ ํ์ ์ ์ฑ ์ ๋ชจ๋ฅด์ง๋ง ๋๋ ๋น์ ์ ๋ฑ์ ๋ฐ๊ฒ ์ต๋๋ค.
๋๋ ์ค๋๋ ์ฃผ์ฅ์ ๋ค์ ์ฝ๋ ๊ฒ์ ๋ํ ํ์ ์ ์ฑ ์ ๋ชจ๋ฅด์ง๋ง ๋๋ ๋น์ ์ ๋ฑ์ ๋ฐ๊ฒ ์ต๋๋ค.
๊ทธ๋ค์ ์ด์ ์ ๋ซํ ์ฃผ์ ๋ฅผ ์ฌ๊ณ ํ ๊ฒ์ ๋๋ค. ์ด์ ์๋จ์ ๐๋ฅผ ๋ถ์ด๋ฉด ์๋ฏธ๊ฐ ์๋ค๋ ๋ฏฟ์์ ์ค๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ ํ ์์คํ ์ด ๋ชจ๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ์์ ๋ถ๊ธฐ๋์ด์ผ ํจ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ "๋๋ฌด ๋ณต์กํ" ๋ฒ์ฃผ์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ํจํ์ง๋ง ๋ค์ ๋๋ฌธ ์ฌ์ฉ ์ฌ๋ก๋ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋ด ๊ฐ์ธ์ ์ธ ๋๋์ ํนํ ์ด ํจํด์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ธฐ์กด JavaScript ์ฝ๋๋ฅผ ๋ชจ๋ธ๋งํ ์ ์๋ค๋ ์ ์์ _์์ผ๋ฉด ์ข์_ ๊ฒ์ ๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋ ๊ฑฐ์ JS ๋ฌธ์ ์ ๋ํด ์ ํ ๋ถ๋ด์ค๋ฝ์ง ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๊ฐํด ๋ธ๋ค๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ ๊ฒ์ ๋๋ค. ๋๋ ์ฌ์ ํ ์ผ์ข ์ TS Greenhorn์ด๋ฏ๋ก ํ์ฌ ์๋ฃจ์ (๊ฐ์ ์บ์คํ ๋๋ ๋ถํ์ํ ์ ํ ๊ฐ๋)์ด ๊ธฐ์กด ๊ธฐ๋ฅ์ ์ต์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ผ๊น์?
๋์ํ๋ค. setter
์ ํ์ด ๊ฐ์์ผ ํ๋ ๊ฒฝ์ฐ ๋๋ฌด ์ ํ์ ์
๋๋ค... ๊ฐ์ ํ์ญ์์ค.
์ด๋ฅผ ์ํํ๊ธฐ ์ํ ๊ถ์ฅ ์ฌํญ์ ์ฐพ๊ณ ์์ต๋๋ค.
get price() {
return (this._price as number);
}
set price(price) {
this._price = typeof price === 'string' ? parseFloat(parseFloat(price).toFixed(8)) : parseFloat(price.toFixed(8));
}
์ ์ฅ๋ ๊ฐ์ด ์ซ์๊ฐ ๋๊ธฐ๋ฅผ ์ํ์ง๋ง ์์ฑ์ ์ค์ ํ ๋๋ง๋ค parseFloat๋ฅผ ์ํํ ํ์๊ฐ ์๋๋ก setter์์ ๋ฌธ์์ด์์ float๋ก ๋ณํํ๊ณ ์ถ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด Typescript ๋ด๋ถ์ ์ ๋ง์ง ์๋ ์ ํจํ(๋๋ ์ต์ํ ํฉ๋ฆฌ์ ์ผ๋ก ์ ๋ฐ์๋ค์ฌ์ง) Javascript ํจํด์ด๋ผ๊ณ ํ๊ฒฐ์ ๋ด๋ ธ์ต๋๋ค. ๋ด๋ถ ๋ณ๊ฒฝ์ด ๋๋ฌด ํฐ ๋ณ๊ฒฝ์ด๋ผ๋ฉด TS๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ปดํ์ผ๋๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ์ผ์ข ์ ์ฃผ์์ ์ป์ ์ ์์ต๋๊น? ๊ฐ์ ๊ฒ
class Widget {
get price(): number | /** <strong i="7">@impossible</strong> */ string | undefined { return this._price; }
set price(val: number|string|undefined){ ... }
}
let w = new Widget();
w.price = 10;
// Annotation processes as "let p:number|undefined = (w.price as number|undefined)"
let p: number|undefined = w.price;
์ฆ, TS๊ฐ JS๋ก ๋ณํ๋๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ๊ธฐ(?)๊ฐ w.price
์ ๋ชจ๋ ์ฝ๊ธฐ๋ฅผ ๋ช
์์ ์บ์คํธ๋ก ๋ณํํ๋๋ก TS๋ฅผ ๋งํฌ์
ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก TS๊ฐ ์ฃผ์์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ด๋ถ๋ฅผ ์์ง ๋ชปํ๋ฏ๋ก ์ด๊ฒ์ ์์ ํ ์ฐ๋ ๊ธฐ์ผ ์ ์์ง๋ง ์ผ๋ฐ์ ์ธ ์์ด๋์ด๋ TS ๋ณํ๊ธฐ๋ฅผ JS๋ฅผ ์์ฑํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์ ์๋์ง๋ง set
๋ฅผ ์ฐํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. IMO get
๋ ํญ์ ๋์ผํ ๋ณ์ ์ ํ์ ๋ฐํํด์ผ ํ๋ฏ๋ก ์ด ์ ๋๋ฉด ์ถฉ๋ถํ์ต๋๋ค.
class Widget {
get price(): number { return this._price; }
set price(val){ return this.setPrice(val); } // call another function
// do processing here
private setPrice(price: number | string): number {
let num = Number(price);
return isNaN(num) ? 0 : num;
}
}
@iamjoyce widget.price = '123'
๋ ์ฝ๋์์ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
@iamjoyce => ์ปดํ์ผ๋ฌ๊ฐ $ set price(val)
val: number
๋ฅผ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์๋ชป๋์์ต๋๋ค.
์, Angular์ ๊ตฌ์ฑ ์์ ์ฌ์ฉ์ด ๋ค๋ฅธ getter/setter ์ ํ์ ๊ฐ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ ๋ ์ฌ๊ธฐ์ ์์ต๋๋ค.
Angular๋ ์ ๋ ฅ ์์ฑ์ ์ ํ์ ๊ด๊ณ์์ด (๋ฐ์ธ๋ฉ ํํ์์ ์ฌ์ฉํ์ง ์๋ ํ) ๋งํฌ์ ์์ ๊ตฌ์ฑ ์์ ์์ฑ์ ์ค์ ํ๋ฉด(์์ฑ์ ํตํด) ํญ์ ๋ฌธ์์ด์ ์ฃผ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ธ๋งํ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค.
private _someProperty: SomeEnum;
set someProperty(value: SomeEnum | string) {
this._someProperty = this.coerceSomeEnum(value);
}
get someProperty(): SomeEnum {
return this._someProperty;
}
์ค๋๋ ์ด๊ฒ์ | string
๋ฅผ ์๋ตํ๋ฉด ์๋ํ์ง๋ง Angular๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ ์ ํํ๊ฒ ์ค๋ช
ํ ์ ์์ต๋๋ค. ์ฝ๋์์ ์ก์ธ์คํ๋ฉด ์์ฑ์ ์ ํ์ด ์ค์ํ์ง๋ง ์์ฑ์ฒ๋ผ ์ค์ ํ๋ฉด ๋ฌธ์์ด์ด ๊ฐ์ ๋ก ์
๋ ฅ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก API๋ฅผ ์ค๊ณํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ด ๊ธฐ๋ฅ์ ์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์์ฑ์ด ๋ฎ๊ฐ ์๋์์ ๊ฐ์ ๋ถ์์ฉ์ ์ผ์ผํค์ง ์๋ ๊ฒฝ์ฐ ๋ ๋ซ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์์ฑ ์งํฉ ๋ ๋ฐ์ธ๋ฉ ์์ฑ ์งํฉ์ด ์๋ก ๋ค๋ฅธ ์ง์ ์ ์ ๋ค์ด๊ฐ๋๋ก Angular๊ฐ ์ค๊ณ๋์์ผ๋ฉด ์ข์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ค์ฉ์ ์ผ๋ก ๋ณด๋ฉด TypeScript๊ฐ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ ํ ํ๋ฑ ๊ณต๋ฆฌ๋ฅผ ๋ฌด์ํ๋ ๋ฐฉ์์ผ๋ก ์ฐ๋ฆฌ ์ ํ์ ์ฌ์ฉํ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํธ ์์ฉ์ ๋ชจ๋ธ๋งํ ์ ์๊ฒ ํด์ค๋ค๋ฉด ๋์์ด ๋ฉ๋๋ค.
์ด ๊ฒฝ์ฐ ๋ชจ๋ ์ข ๋ฅ์ ์ฑ๊ฐ์ ์ ํ ๊ฐ๋/์ด์ค์ ์ด ํ์ํ๋ฏ๋ก getter์์ ๊ณต์ฉ์ฒด ์ ํ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ๋๊ตฌ๋ผ๋ ์์ฑ์์ ์ค์ ๋๋ ์์ฑ์ด ๋ฌธ์์ด์์ ํ ๋น ๊ฐ๋ฅํด์ผ ํ๋์ง ํ์ธํ๋ ค๊ณ ์๋ํ๊ธฐ ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ setter์์ ๊ณต์ฉ์ฒด ์ ํ์ ๋จ๊ฒจ๋๋ ๊ฒ์ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ ์ ํ ์์คํ ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ํ์ ์ฌ์ฉํ๋๋ก ํ์ฉ๋๋ ๋ฐฉ๋ฒ์ ์บก์ฒํ ๋งํผ ์ถฉ๋ถํ ํํ์ ์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์ ๋ก ์ ํ ์ ๋ณด์ ํจ๊ป ์ ํ ์คํฌ๋ฆฝํธ ์์ค์์ ์ด๋ฌํ ์ ํ์ ์๋นํ์ง ์๊ธฐ ๋๋ฌธ์ _์ฆ๊ฐ์ ์ผ๋ก_ ์ค์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๊ตฌ๊ฐ ์ ํ ์ ๋ณด๋ฅผ ๋งค์ฐ ์ ์๋นํ ์ ์์ผ๋ฏ๋ก ๊ฒฐ๊ตญ ์ค์ํ ์ ์์ต๋๋ค.
์์ ํ ์ฌ๋์ ์ฝ๊ฐ ๋ถ์พํด ๋ณด์ด์ง๋ง ์๋ง๋ ์๋ํ ์ ์๋ ๋์ฒด ์๋ฃจ์ ์ ์ธ๊ธํ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด setter/getter ๋ชจ๋์ ๋ํด ๊ณต์ฉ์ฒด ์ ํ์ ์ฌ์ฉํ ์ ์์ง๋ง ๊ณต์ฉ์ฒด์ ํน์ ์ ํ์ด getter์ ๋ํด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ค์ ๋ก ๋๊ตฐ๊ฐ๊ฐ ์ ํ ๊ฐ๋๋ฅผ ์ฌ์ฉํ์ฌ ์กด์ฌํ์ง ์๋์ง ํ์ธํ๋ ๊ฒ์ฒ๋ผ getter ํธ์ถ ์ฌ์ดํธ ์ฌ์ดํธ ์ ์ด ํ๋ฆ์์ ๊ณ ๋ ค ์ฌํญ์์ ์ฌ์ ์ ๊ฑฐ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ getter์ ํ์ ์งํฉ ํฉ์งํฉ๊ณผ ๋น๊ตํ์ฌ setter์ ์์ ์งํฉ ํฉ์งํฉ์ ํ์ฉํ๋ ๊ฒ๊ณผ ๋น๊ตํ๋ฉด ์ฑ๊ฐ์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ์๋ง๋ ๊ทธ๊ฒ์ด ๋ด๋ถ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค. setter๊ฐ getter ์ ํ์ ์์ ์งํฉ ์กฐํฉ์ธ ํ. getter ๋ฐ setter ์ ํ์ ๋ด๋ถ์ ์ผ๋ก ๋๋ฑํ๊ฒ ์ทจ๊ธํ์ง๋ง getter์ ๊ณต์ฉ์ฒด ์ ํ ๋ถ๋ถ์ ๋ถ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ด ํ๋ฆ ๋ถ์์ ๊ณ ๋ ค ์ฌํญ์์ ์ ๊ฑฐํฉ๋๋ค. ์ค๊ณ ์ ์ฝ์ ํผํ ์ ์์ต๋๊น?
์์ ๋ด์ฉ์ ์์ธํ ์ค๋ช ํฉ๋๋ค. ๋ณตํฉํ์ ์ผ๋ถ๋ฅผ ๋ถ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์ํ ์ ์๋ ๊ฒ์ด ํ์ ํํ์ฑ์ ๊ด์ ์์ ์ ์ฉํ ๊ฒ์ผ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ ๊ตฌ์กฐ๊ฐ ๋์ผํ์ง๋ง ๋ถ๊ฐ๋ฅํ ์์ ์๊ฐ ์๋ ๋ค๋ฅธ ์ ํ๊ณผ์ ๋๋ฑ์ฑ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ๋ถ๊ฐ๋ฅํ ์์ ์๋ ์ ์ด ํ๋ฆ ๋ถ์์๋ง ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋์ฒด ์ ์์ผ๋ก ์ฌ์ฉ์ ์ ์ ์ ํ ๊ฐ๋๋ฅผ ๋ฐํ ๊ฐ์ ์ ์ฉํ๋ ๊ตฌ๋ฌธ์ด ์๋ค๋ฉด ์ด๊ฒ์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค. ์ ์์ ์ธ ์ํฉ์์๋ ์ด๊ฒ์ด ์ฝ๊ฐ ์ฐ์ค๊ฝ์ค๋ฝ์ง๋ง ๋ฐํ ๊ฐ๊ณผ ์ธ์์ ๋ํด ๊ทธ๋ฐ ์ข ๋ฅ์ ํํ์ด ์์ผ๋ฉด ์ด๋ฌํ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ฐํ ๊ฐ์ ๋ํ ์ฌ์ฉ์ ์ ์ ์ ํ ๋ณดํธ๋ ์์ฑ์ผ๋ก ์์ถ๋ ๋ ์ ํ ์ ์ธ/์ธํฐํ์ด์ค์์ ํํํ ์ ์๋ ์ด์ ๋ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด mobx-state-tree๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ๋ฒ(์ธ์คํด์ค ๋ฐ ์ค๋ ์ท ์ ํ์์)์ผ๋ก ์์ฑ์ ์ค์ ํ ์ ์์ง๋ง get ์ ๊ทผ์์์ ๋จ์ผ ํ์ค ๋ฐฉ์(์ธ์คํด์ค)์ผ๋ก๋ง ์์ฑ์ ๋ฐํํฉ๋๋ค. ์ง์๋๋ค๋ฉด ๋งค์ฐ ์ ์ฉํ ๊ฒ์ ๋๋ค.
๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋ค.
interface SomeNestedString {
foo: string;
}
...
private _foo: SomeNestedString | string;
get foo(): SomeNestedString | string {
return this._foo;
}
set foo(value: SomeNestedString | string) {
this._foo = (value as SomeNestedString).foo;
}
๋๋ ๊ทธ๊ฒ์ด ๋น๋ฉดํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ค์ ๋ก๋ getter๊ฐ ๊ณต์ฉ์ฒด ์ ํ์ ํ์ ์งํฉ๋ง ๋ฐํํ๋๋ผ๋ getter๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ ํ ์ ํ ๊ฐ๋๊ฐ ํ์ํฉ๋๋ค.
TSLint๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด any
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ๋ ๋ถํํ์ง ์์ต๋๋ค.
export class FooBar {
private bar: string;
get foo (): string | any {
return this.bar;
}
set foo (value: Date | string | any) {
// Type guarding enables IntelliSense in VS Code
if (value instanceof Date) {
this.bar = value.toISOString();
} else if (typeof value === 'string') {
this.bar = value;
} else {
this.bar = String(value); // Or throw an error
}
}
}
@jpidelatorre ์ด๋ฐ ์์ผ๋ก ์ ํ ์์ ์ฑ์ ์๊ฒ ๋ฉ๋๋ค.
const fooBar = new FooBar()
const a: number = fooBar.foo // works while it should fail
fooBar.foo = 123 // fails only at runtime, not compile time. It doesnt fail in this particular case with strings and numbers, but it will with something more complex
@keenondrums ์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ ๊ทผ์๊ฐ ๋ค๋ฅธ ์ ํ์ ๊ฐ์ง๊ธฐ๋ฅผ ์ํ๋ ์ด์ ์ ๋๋ค. ๋ด๊ฐ ์ฐพ์ ๊ฒ์ ํด๊ฒฐ์ฑ ์ด ์๋๋ผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
@jpidelatorre ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ setter๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
export class FooBar {
private bar: string;
get foo (): string {
return this.bar;
}
setFoo (value: Date | string ) {}
}
@keenondrums ์ ์์๋งํผ์ ์๋์ง๋ง ์์ง๊น์ง๋ ์ต์ ์ ์ ํ์ ๋๋ค.
getter์ ๋ํด ๋ณ๋์ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ Angular ๊ตฌ์ฑ ์์์ @input ์์ฑ์ผ๋ก ๋ฐ์ํ๋ ์ผ์ ๋ํ ๋ชจ๋ธ์ด ์๋๋๋ค.
๋๋ฌด ์ถ์ ํฉ๋๋ค.
๋๋ ๋ํ ์ด ๊ธฐ๋ฅ์ ์ํ์ง๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ .d.ts ํ์ผ์์ ์ ์๋ํด์ผ ํฉ๋๋ค. Mocha(Objective-C/Javascript ๋ธ๋ฆฌ์ง)๋ฅผ ํตํด ๋ ธ์ถ๋ ์ผ๋ถ ํด๋์ค๋ฅผ ๋ฌธ์ํํ๋ ค๊ณ ํ๊ณ ๋ํ๋ ํญ๋ชฉ์ ์ธ์คํด์ค ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ๋ฉ๋๋ค.
class Foo {
get bar:()=>number;
set bar:number;
}
const foo = new Foo();
foo.bar = 3;
foo.bar(); // 3
๋ํ API๋ฅผ ์ฌ์ฉํ์ฌ ์ธํฐํ์ด์ค์ ์ผ์นํ๋ ๊ฐ์ฒด๋ก ์์ฑ์ ์ค์ ํ ์ ์์ง๋ง getter๋ ํญ์ ์ค์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋ณด์์ต๋๋ค.
interface IFoo {
bar: string;
}
class Foo implements IFoo {
bar: string;
toString():string;
}
class Example {
get foo:Foo;
set foo:Foo|IFoo;
}
๋๋ ์ด ๋ฌธ์ ์ ๋ํด ๋์ฒด๋ก ์๊ณ ์์์ง๋ง, ๊ทธ๊ฒ์ ๋ค์ ์ฝ์ผ๋ฉด์ ํ ๊ฐ์ง ์๊ฐ์ด ๋ ์ฌ๋๋ค. ๋๋ ์ด๊ฒ์ด ์ถ์์ ์ผ๋ก ํ ๊ฐ์น๊ฐ ์์ง๋ง ์คํ ๊ฐ๋ฅํ๊ธฐ์๋ ๋๋ฌด ๊ธฐ์ ์ ์ผ๋ก ๋ณต์กํ๋ค๋ ์์ด๋์ด์ ์ ์ฐฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ์ ์ถฉ์ ๊ณ์ฐ์ ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ฉฐ ๊ตฌํํ๋ ๋ฐ ์๊ฐ๊ณผ ๋ ธ๋ ฅ(๋ฐ ์ฝ๋ ๋ณต์ก์ฑ ์ถ๊ฐ)์ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ค๋ฅธ์ชฝ?
์ด๊ฒ์ด ํต์ฌ DOM API๋ฅผ ์ ํํ๊ฒ ๊ธฐ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค๋ ์ฌ์ค์ด ์ํ์ ์ ํ ๋ณ๊ฒฝํฉ๋๊น? @RyanCavanaugh ๋ผ๊ณ
๋๋ ์ด ์ฝ๋
foo.bar = "hello"; console.log(foo.bar);
๊ฐ ์ ์์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ค๊ณ ์๋ํ๋ ์ธ์ด์์ "hello" ์ด์ธ์ ๋ชจ๋ ๊ฒ์ ์ธ์ํด์ผ ํ๋ค๋ ์๊ฐ์ ์ง์ ์ผ๋ก ๋ฐ๋ํฉ๋๋ค.
์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํด ๋
ผ์ํ ์ ์์ง๋ง DOM์ ํญ์ el.hidden=1; console.log(el.hidden) // <-- true, not 1
์ ๊ฐ์ ๊ตฌ์ฑ์ ์ง์ํ์ต๋๋ค. ์ด๊ฒ์ ๋จ์ง ์์์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ ํจํด์ด ์๋๋ฉฐ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๊ธฐ ๋๋ฌธ์ ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. JS๊ฐ ํญ์ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ํต์ฌ ๊ต๋ฆฌ์
๋๋ค. DWIM์ด ์ธ์ด์ ํต์ฌ์ ๋
น์๋ค์ด ์์ต๋๋ค. ์ธ์ด ์์ค์์ ์ด๋ฅผ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ JS์ "์์ ์งํฉ"์ด์ด์ผ ํ๋ค๋ TS์ ๊ธฐ๋ณธ ์์น์ ๊นจ๋ ๊ฒ์
๋๋ค. . ๊ทธ๊ฒ์ ๋ฒค๋ค์ด์ด๊ทธ๋จ์์ ํ์ด๋์จ ๋ชป์๊ธด ๊ฑฐํ์ด๋ฉฐ, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์์ด์๋ ์๋ฉ๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ์ฌ์ ํ ๋์ผํ ์ ํ์ setter/getter๋ฅผ ์ ์งํ๋ ์์ด๋์ด๋ฅผ ์ข์ํ๋ ์ด์ ์ ๋๋ค.
number | boolean
๊ทธ๋ฌ๋ getter๊ฐ ๊ธฐ์ ์ ์ผ๋ก ๋์ผํ ๊ณต์ฉ์ฒด ์ ํ์ ๊ฐ์ง๋ง ์ค์ ๋ก๋ ๊ณต์ฉ์ฒด์ ์๋ ์ ํ์ ํ์ ์งํฉ๋ง ๋ฐํํ๋ค๋ ๊ฒ์ ๋ํ๋ผ ์ ์๋ ์ผ์ข ์ typegaurd๋ฅผ ๋์ ํฉ๋๋ค. getter(์ถ๋ก ํ๋ฆ ๋ฌธ์ ?)์์ ์ผ์ข ์ ์ขํ๋ ๊ฐ๋๋ก ์ฒ๋ฆฌํ๋ฉด ์ ํ ๋ชจ๋ธ์ ์์ ํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํด์ง์ง ์์ต๋๊น? (๊ทธ๋ ๋ด๋ถ์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅธ๋ค๊ณ ๋งํ๋ค...)
๋๋ getter์ ์ฌ์ฉ๋ ์ ํ์ด setters ์ ํ์ ์๊ฒฉํ ํ์ ์งํฉ์ธ ๊ฒฝ์ฐ์๋ง ์์๋ ์ ์์ต๋๊น?
๋๋ getter์ ์ฌ์ฉ๋ ์ ํ์ด setters ์ ํ์ ์๊ฒฉํ ํ์ ์งํฉ์ธ ๊ฒฝ์ฐ์๋ง ์์๋ ์ ์์ต๋๊น?
๐ !
์ค์ ๊ฐ๋ฅํ์ง ์์ ์ ํ์ ์ป์ ์ ์์ด์ผ ํ๋ค๋ ๋ฐ ์ฐ๋ฆฌ ๋ชจ๋ ๋์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. get
์ ์ ํ์ ์๋์ผ๋ก ์ขํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ํญ์ ๊ทธ๋ฐ ์ ํ์ด ๋๋๋ก ํ๊ณ ์ถ์ต๋๋ค.
๋๋ ์ ์ผ๋ถ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ด ์ ํ ์์ ๊ณผ ๋ชจ๋ ๊ฒ์ ์๋ฐํ ๊ฒ์ด๋ผ๊ณ ๋ฐ๋ํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ ์ด๋ setter๊ฐ ๋ค๋ฅธ ์ ํ์ ๊ฐ์ง ์ ์๋๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ ์ ํ ์์ ์ฑ์ ์๋ฐํ๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง ์์ต๋๋ค.
์ :
์์ฑ์ด Array๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์ธ _employeeIdList : ๋ฒํธ[]
EmployeeIDList() ๊ฐ์ ธ์ค๊ธฐ: ์ซ์[] {
์ด๊ฒ์ ๋ฐํํ์ญ์์ค._employeeIdList ;
}
EmployeeIDList(_idList: ๋ชจ๋ ) ์ค์ {
if (typeof _idList== '๋ฌธ์์ด') {
this._employeeIdList = _idList.split(',').map(d => ์ซ์(d));
}
else if (typeof _idList== '๊ฐ์ฒด') {
this._employeeIdList = _idList as number[];
}
}
๋๋ ์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๊ณ SET์์ ๋ค๋ฅธ ์ ํ์ ํ์ฉํ์ง๋ง ์ฌ์ ํ ์์ฑ์ ์๋ชป๋ ์ ํ์ ํ ๋นํ๋ ๊ฒ์ ๋ง์ง๋ง ์๋ฒฝํ๊ฒ ์ ํ ์์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์น๋ฆฌํ์ธ์. ํ์๋ค์ด ์์กด์ฌ์ ๋ด๋ ค๋๊ณ ๊ทธ๊ฒ์ด ๋ง๋ค์ด๋ด๋ ๋ฌธ์ ๋ฅผ ์๊ฐํ๊ณ ๊ณ ์ณ๋๊ฐ๊ธธ ๋ฐ๋๋๋ค.
๋๋ ์ด๊ฒ์ด ๊ธฐ์กด JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์์ ๋ชจ๋ธ๋งํ๋ ๋ฐ ์ฌ์ ํ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค๋ ์ ์์ ์ฐจ์ํ๊ณ ์ถ์ต๋๋ค.
์ฝ๋ฅผ ์ผ๊ณ ์ ํ์ ๋ค์ด์ค๋ ์ ํ์ ํ์ ์งํฉ์ผ๋ก ๊ฐ์ ๋ณํํ๊ณ ํญ์ getter์ ํ์ ์งํฉ์ ์ฝ๋ ๋์๋ก ๋ฐํํ๋ setter๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ข์ง๋ง ์ค์ ๋ก๋ JS ์์ญ์์ ์๋นํ ์ผ๋ฐ์ ์ธ ํจํด์ ๋๋ค. .
TypeScript๋ ์ด์์ ์ผ๋ก ๊ตฌ์กฐํ๋ API๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด JS API์ ์์๋ฅผ ์ค๋ช ํ ๋ ๋งค์ฐ ํํ๋ ฅ์ด ๋ฐ์ด๋๋ค๋ ์ ์์ ํ๋ฅญํ๋ค๊ณ ์๊ฐํฉ๋๋ค. TypeScript๊ฐ getter๊ฐ ํญ์ getter ์ ํ์ ์๊ฒฉํ ํ์ ์งํฉ์ธ ์ ํ์ ๋ฐํํ๋ค๋ ๊ฒ์ ๋ํ๋ผ ์ ์์ ๋งํผ ํํ๋ ฅ์ด ๋ฐ์ด๋๋ฉด ๊ธฐ์กด API ๋ชจ๋ธ๋ง์ ์์ฒญ๋ ๊ฐ์น๊ฐ ์ถ๊ฐ๋๋ ์ฅ๋ฉด์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋!
์ ๋ขฐํ ์ ์๋ ์ ํ ์ DOM XSS์ ์ธ์ฐ๊ธฐ ์ํ ์๋ก์ด ๋ธ๋ผ์ฐ์ API ์ ์์
๋๋ค. Chromium์์ ์ด๋ฏธ ๊ตฌํ๋์ด ์์ต๋๋ค(ํ๋๊ทธ ๋ค). API์ ๋๋ถ๋ถ์ ์ ๋ขฐํ ์ ์๋ ์ ํ์ ํ์ฉํ๋๋ก ๋ค์ํ DOM ์์ฑ์ ์ค์ ์๋ฅผ ์์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด .innerHTML
๋ TrustedHTML | string
๋ฅผ ํ์ฉํ์ง๋ง ํญ์ string
๋ฅผ ๋ฐํํฉ๋๋ค. TypeScript์์ API๋ฅผ ์ค๋ช
ํ๋ ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
์ด์ ์ฃผ์๊ณผ์ ์ฐจ์ด์ ์ ์ด๊ฒ์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ๋ธ๋ผ์ฐ์ API(์ฌ์ฉ์ ์์ญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋)๋ผ๋ ๊ฒ์
๋๋ค. ๋ํ Element.innerHTML
any
(ํ์ฌ ๊ฐ๋ฅํ ์ ์ผํ ์๋ฃจ์
)๋ก ๋ณ๊ฒฝํ๋ ์ํฅ์ ์ฌ์ฉ์ ์์ญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ์ ํํ๊ฒ ์ค๋ช
ํ๋ ๊ฒ๋ณด๋ค ํฝ๋๋ค.
์ด pull-request๊ฐ ๋ค์ ์ด๋ฆด ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น? ์๋๋ฉด ๋ด๊ฐ ๋์น ๋ค๋ฅธ ์๋ฃจ์ ์ด ์์ต๋๊น?
์ฐธ์กฐ: @mprobst , @koto.
TypeScript์ ๊ฐ์ ์ ํ ํตํฉ์ ์ง์ํ๋ ์ธ์ด์์ ์ด ๊ธฐ๋ฅ์ ์์ฐ์ค๋ฝ๊ณ ํ๋งค ํฌ์ธํธ์
๋๋ค.
@RyanCavanaugh getter์ setter๊ฐ ๊ฐ์ ์ ํ์ ๊ฐ์ง๊ณ ์๋๋ผ๋ setter๋ก o.x === y
์ดํ์ o.x = y
#$0$#$๊ฐ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ ์ ์ผ๋ถ ์ ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค.
element.scrollTop = -100;
element.scrollTop; // returns 0
@vrana์ ๋ ๋ฒ์งธ ์ฐ๋ ค ์ฌํญ์ ๋๋ค. ํ์ฌ ๋์์ผ๋ก ์ธํด Typescript์์ ๊ธฐ์กด API ์ค ์ผ๋ถ๋ฅผ ๋ชจ๋ธ๋งํ ์ ์์ต๋๋ค.
์ด๊ฒ์ setter์ getter ์ ํ์ด ๋ค๋ฅธ ๋ง์ Web API์ ํนํ ํด๋น๋ฉ๋๋ค. ์ค์ ๋ก ์น API ์ค์ ์๋ ๋ชจ๋ ์ข ๋ฅ์ ์ ํ ๊ฐ์ ๋ณํ์ ์ํํ๋ฉฐ, ๊ทธ ์ค ์ผ๋ถ๋ ์ฃผ์ด์ง ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ ๋ํด ์ง์ ์ง์ ๋์ง๋ง ๋๋ถ๋ถ์ IDL ์ ํตํด ์์์ ์ผ๋ก ์ํ๋ฉ๋๋ค. ๋ง์ setter๊ฐ ๊ฐ๋ ๋ณ๊ฒฝํฉ๋๋ค(์: ์์น ์ธํฐํ์ด์ค ์ฌ์ ์ฐธ์กฐ). ์ด๊ฒ์ ๋จ์ผ ๊ฐ๋ฐ์ ์ค์๊ฐ ์๋๋๋ค. ์น ๊ฐ๋ฐ์๊ฐ ์ฝ๋ฉํ๋ API ์ฌ์์ ๋๋ค.
getter ์ ํ์ ์ขํ๋ฉด Typescript๊ฐ ํด๋น API๋ฅผ ๋ํ๋ผ ์ ์์ง๋ง ์ด์ ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์์ฑ์ ์ ํ์ด setter์ ์ ๊ณตํ๊ฑฐ๋ getter์์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฐ๋ฅํ ์ ํ์ ์กฐํฉ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์ ํํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ API๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
API๋ฅผ ๊ทธ๋ฐ ์์ผ๋ก ์ค๋ช ํ๋ ๊ฒ์ _ํจ์จ์ _์ด ์๋๋๋ค. ์๋น์๊ฐ ๊ฐ๋ฅํ ์ ํ์ ์ขํ๊ธฐ ์ํด getter๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ธ์คํด์ค์์ ์ ํ ๊ฐ๋๋ฅผ ์ฌ์ฉํ๋๋ก ์๊ตฌํ๊ณ ์์ต๋๋ค.
๋ง์ Web API๊ฐ ์ฌ์์ ์ ๊ฒจ ์๊ธฐ ๋๋ฌธ์ ํญ์ getter์์ ์ถ์๋ ์ ํ์ ๋ฐํํ๋ ๊ฒ์ ๊ณต๋ฆฌ์ ์ผ๋ก ๋ง๋ค์ง ์์์ด๋ ๊ด์ฐฎ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ ์ ์ ์ณ๋๊ณ ์ฌ์ฉ์ API์ ๋ํด ์ด์ผ๊ธฐํ๋๋ผ๋ setter ์์ ๊ณต์ฉ์ฒด ์ ํ์ ์๋ฝํ๋ ๊ฐ๋ ฅํ ์ฌ์ฉ ์ฌ๋ก๋ "์คํฌ๋ฆฝํธ"์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ํ๋ ์ ํ์ผ๋ก ์์ฉ ๊ฐ๋ฅํ๊ฒ ๊ฐ์ ํ ์ ์๋ ์ด์ฐ ์ ํ์ ๋ฒ์๋ฅผ ํ์ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ ํ์ฉํฉ๋๊น? ์ฌ์ฉ์ ์ฉ์ด์ฑ.
์์ฒด ํ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ๊ฐ๋ฐ ์ค์ธ API์๋ ์ค์ํ์ง ์์ ์ ์์ง๋ง, ๊ณต๊ฐ๋๊ณ ์ผ๋ฐํ๋ ์ฌ์ฉ์ ์ํด ์ค๊ณ๋ API์๋ ์ค์ํ ์ ์์ต๋๋ค.
TypeScript๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ถ ์์ฑ์ ๋ํด ํ์ฉ๋๋ ์ ํ์ ์ํํ API๋ฅผ ์ ํํ๊ฒ ์ค๋ช ํ ์ ์๋ค๋ ๊ฒ์ ๋ฉ์ง ์ผ์ด์ง๋ง, getter ๋ฐํ ์ ํ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ๊ณผ๋ํ ์ ํ ๊ฒ์ฌ/๋ณดํธ๊ฐ ํ์ํ ๋ค๋ฅธ ์ชฝ ๋์ ๋ง์ฐฐ๋ก ์ธํด ๊ทธ ์ด์ ์ด ์์๋ฉ๋๋ค. , _์ง์ _ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด @RyanCavanaugh๊ฐ ๊ฐ์ ํ๋ ์ด์์ ์ธ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ์๋๋ฆฌ์ค๋ผ๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ์ด ๊ฒฝ์ฐ๋ ์ง์ ํ๋์๋ ๋์ผํ ๊ณต์ฉ์ฒด ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ getter ๋ฐ setter๊ฐ ํญ์ ๋์ผํ ๊ณต์ฉ์ฒด ์ ํ์ ๊ฐ์ ธ์ผ ํ๋ฉฐ ํญ์ ํด๋น ๊ฐ์ ์๋ณตํ๊ฒ ๋๋ฉฐ ์ ํ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ฌด์๋ฏธํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ด ์๊ฐ์๋ ์ด ์ฌ๋ก๊ฐ ๋ ์ด์ํ๋ ๊ณต์ฉ์ฒด ์ ํ ์ฌ์ฉ์ ์ค์ฌ์ผ๋ก ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ์์ฑ๋ ์ ํ์ ์ฒ๋ฆฌํ๊ณ ์ค์ ๋ก ํด๋น ์ฐํฉ ์ ํ์ ์๋ฏธ ๋จ์๋ก ์ทจ๊ธํ๋ฏ๋ก ๋ณ์นญ์ ์์ฑํด์ผ ํฉ๋๋ค.
type urlRep = string | Url;
๋๋ถ๋ถ์ ๊ฒ์ ๊ทธ๋ฅ ์๋ณตํ๊ณ ์ผ๋ฐ์ ์ธ ์ํ๋ง ๋ค๋ฃจ๋ฉฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ผ๋ถ ์ ํ ๊ฐ๋๋ก ๋ธ๋๋ฐ์ค๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์ค๋ช ํ๋ ๊ฒ๊ณผ๋ ์์ ํ ๋ค๋ฅธ ์๋๋ฆฌ์ค๋ผ๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ค๋ช ํ๋ ๊ฒ์ ํนํ JavaScript์ ๊ฐ์ ์คํฌ๋ฆฝํ ์ธ์ด์์ ์ฌ์ฉํ๊ธฐ ์ํ ์ผ๋ฐ/๊ณต์ฉ API๊ฐ ์ข ์ข ์๋์ ์ผ๋ก setter์ ํ์ฉ๋๋ ์ ํ์ ์ํํ๋ค๋ ์ฌ์ค์ ๋๋ค. ๊ทธ๋ค์ ๊ทธ๊ฒ์ ๋ชจ๋ ์์ฉํ๋ ์ถ์ ์ง ํฅ์์ผ๋ก ์ ๊ณตํฉ๋๋ค.
API์ ์์ฐ์์ด์ ์๋น์์ธ ๊ฒฝ์ฐ ์ด๋ฌํ ์ข ๋ฅ์ ์์ ์ด ๋ ๋ง์ ์์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ ๋ฌด์๋ฏธํด ๋ณด์ผ ์ ์์ง๋ง ๋๋ ์๋น๋ฅผ ์ํ API๋ฅผ ์ค๊ณํ๋ ๊ฒฝ์ฐ์๋ ๋ง์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ ์๋ฌด๋ setter/getter๊ฐ _disjoint_ ์ ํ์ ๊ฐ๊ธฐ๋ฅผ ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ ผ์๋๋ ๊ฒ์ API ์์ฐ์๊ฐ API ์๋น์์๊ฒ getter๊ฐ setter์ ํตํฉ ์ ํ์ ์๊ฒฉํ ํ์ ์งํฉ์ธ ์ ํ์ ๊ฐ์ง ๊ฐ์ ๋ฐํํ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ ๋๊ตฌ๋ setter/getter๊ฐ ๋ถ๋ฆฌ๋ ์ ํ์ ๊ฐ๊ธฐ๋ฅผ ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๊ฒ์ ๋ํ ๋ฐ๋ ๊ด์ ์ ์ ๊ณตํ๊ธฐ ์ํด์์ ๋๋ค. setter/getter์ ๋ํด ๋ถ๋ฆฌ๋ ์ ํ์ ๊ฐ๋ ๊ฒ์ด ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ํ ํฉ๋ฒ์ ์ด๊ธฐ ๋๋ฌธ์ ํ์คํ ์ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์๊ฐ์ ์ฃผ์ ๋ชฉํ๋ (์ ์ด๋ .d.ts ์์ค์์) ์๋ฐ์คํฌ๋ฆฝํธ์์ ํฉ๋ฒ์ ์ธ ๋ชจ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฅํ ์ ์์ ์ ๋๋ก ์ ํ ์์คํ ์ ํํ๋ ฅ ์๊ฒ ๋ง๋๋ ๊ฒ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ์ญ ๊ฐ์ฒด๋ ํจ์ ๋ฑ๊ณผ ๊ฐ์ ๋ด์ฅ์ ํ๋กํ ํ์ ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ข์ ์ต๊ด์ด ์๋๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ฌ์ ํ .d.ts ํ์ผ์ ๊ทธ๋ฐ ๊ฒ๋ค์ ์ ์ ๋ ฅํ ์ ์์ผ๋ฉฐ ์๋ฌด๋ ๊ทธ๊ฒ์ ํํํ๋ ๊ฒ์ ๋ฃ์ง ๋ชปํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค(๋น๋ก ์๋ชป ์ค๊ณ๋ ์ผ๋ถ ์ ํ ์ ์ ํ์ผ์ด ํ์คํ ์ ํ์ด ์ง์ ๋ ํ์ผ์ ํ์๋๊ธฐ๋ ํ์ง๋ง).
๋ด๊ฐ ์ ์ดํ ์ ์๋ ์ฌ๋ฐ๋ฅธ ์ ํ์ ๊ฐ๊ธฐ ์ํด ์ด๊ฒ์ด ๊ธฐ๋ฅ์ด ํ์ํ ์ํฉ์ ๋ด์ฐฉํ์ต๋๋ค. setter๋ getter์์ ์ผ๊ด๋๊ฒ ๋ฐํํ ์ ์๋ ๋ณด๋ค ์์ ์ฃผ์์ ์ด๊ณ ๋ณด๋ค ๋ณด์์ ์ธ ์ ํ์ผ๋ก ๊ฐ์ ํด์ผ ํฉ๋๋ค.
์ด๋ฐ ๊ธฐ๋ฅ์ด ์์์ผ๋ฉด ์ ๋ง ์ข๊ฒ ์ต๋๋ค. JavaScript ์ฝ๋๋ฅผ TypeScript๋ก ์ด์ํ๊ณ ์๋๋ฐ, ์ ํ ์์ ์ฑ์ ์ํ ๊ฒฝ์ฐ setter๋ฅผ ๋ฆฌํฉํ ๋งํด์ผ ํ๋ ๊ฒ์ ์ ๋ง ํฐ ๋ฌธ์ ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์์ต๋๋ค.
class Vector3 { /* ... */ }
type XYZ = Vector3 | [number, number, number] | {x: number, y: number, z: number}
type PropertyAnimator = (x: number, y: number, z: number, timestamp: number) => XYZ
type XYZSettables = XYZ | PropertyAnimator
export class Transformable {
// ...
set position(newValue: XYZSettables) {
this._setPropertyXYZ('position', newValue)
}
get position(): Vector3 {
return this._props.position
}
// ...
}
์์ํ ์ ์๋ฏ์ด ์ฌ์ฉ๋ฒ์ ๋งค์ฐ ์ ์ฐํฉ๋๋ค.
const transform = new Transformable
// use an array
transform.position = [20, 30, 40]
// use an object
transform.position = {y: 30, z: 40} // skip `x` this time
// animate manually, a property directly
requestAnimationFrame((time) => {
transform.position.x = 100 * Math.sin(time * 0.001)
})
// animate manually, with an array, which could be shared across instances
const pos = [10, 20, 30]
requestAnimationFrame((time) => {
pos[2] = 100 * Math.sin(time * 0.001)
transform.position = pos
})
// Animate with a property function
transform.position = (x, y, z, time) => [x, y, 100 * Math.sin(time * 0.001)]
// or a simple increment:
transform.position = (x, y, z) => [x, y, ++z]
// etc
// etc
// etc
4์ด์ ๋๋ค. ์ด๋ป๊ฒ ์ฌ์ ํ ํด๊ฒฐ๋์ง ์์ต๋๊น? ์ด ๊ธฐ๋ฅ์ ์์ ์๊ฒฌ์์ ์ธ๊ธํ๋ฏ์ด ์ค์ํฉ๋๋ค! ์ ์ด๋ ๋ฌธ์ ๋ฅผ ๋ค์ ์ฌ๋ ๊ฒ์ ๊ณ ๋ คํ์๊ฒ ์ต๋๊น?
๊ทธ๋ฆฌ๊ณ ๋๋ @kitsonk ์ ์์ ํ ๋์ํฉ๋๋ค.
@kitsonk ์์ ์๊ฒฌ์์ ์ค๋๋ ฅ ์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์ถฉ๋ถํ ์ ๊ณต๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ๋์์ธ์ ์ด ์ ํ์ด ์๋ ๋๋ถ๋ถ์ ๋ค๋ฅธ ์ ํ ์ธ์ด์ ๊ณตํต ํจํด์ ๋ฐ๋ฅด์ง๋ง Javascript ์ปจํ ์คํธ์์๋ ๋ถํ์ํ๊ณ ์ง๋์น๊ฒ ์ ํ์ ์ ๋๋ค. ์ค๊ณ์ ์ํ ๊ฒ์ด์ง๋ง ์ค๊ณ๊ฐ ์๋ชป๋์์ต๋๋ค.
TypeScript 3.6์ ์ ์ธ ํ์ผ์ ์ ๊ทผ์๋ฅผ ์ ๋ ฅํ๊ธฐ ์ํ ๊ตฌ๋ฌธ์ ๋์ ํ๋ฉด์ getter์ setter์ ์ ํ์ด ๋์ผํด์ผ ํ๋ค๋ ์ ํ์ ์ ์งํ์ต๋๋ค.
์ฐ๋ฆฌ์ UI ํดํท์ ์๋ ์บ์คํ setter์ ํฌ๊ฒ ์์กดํ๋๋ฐ, ์ฌ๊ธฐ์ setter๋ getter์์ ๋ฐํ๋ ๋จ์ผ ์ ํ๋ณด๋ค ๋ ๋ง์ ์ ํ์ ํ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ TS๊ฐ ์ด ํจํด์ ์ ํ ์์ ํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
@RyanCavanaugh ๊ฐ 3๋ ์ ์ ์ด ๊ธฐ๋ฅ์ ๋ํด ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ๋ฐ๋ฐ์ ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ต๊ทผ์ ๋ณด๊ณ ๋ DOM ์ฌ์ฉ ์ฌ๋ก์ ์๋ก์ด ์ ์ธ ๊ตฌ๋ฌธ์ ๊ฐ์ฉ์ฑ์ด ์๋ก์ด ๊ฒฐ์ ์ ํ์ฉํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
๋ค, ๊ทธ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ณด์๋ง์ ๋ฐ๋ก ์ด ๊ธฐ๋ฅ ์์ฒญ์ด ์๊ฐ๋ฌ์ต๋๋ค. ๋๋ ๋ํ ์ฐ๋ฆฌ์ UI ํ๋ ์์ํฌ์ ๋ชฉ์ ์ ์ํด ๊ทธ๊ฒ์ ์ํฉ๋๋ค. ์ด๊ฒ์ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
TSConf 2019 ๊ฐ 10์ 11์ผ ์ ๊ฐ์ต๋ฉ๋๋ค. ๊ธฐํ๊ฐ ๋๋ค๋ฉด Q&A ์ธ์ ์์ ์ข์ ํ์์ด ๋ ๊ฒ ๊ฐ์์ ๐ค
์ด ๊ธด ์ค๋ ๋์์ ์ด์ ์ ๋งํ์์ง ๋ชจ๋ฅด์ง๋ง ๋ฐ๋ณตํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
TypeScript์ IMO ํํํ ์์คํ ์ ๋ ๊ฐ์ง ๋ณ๊ฐ์ ๋ชฉ์ ์ ์ํํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ๋ ์์ ํ ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์ ์ผํ ๋ชฉ์ ์ด๋ผ๋ฉด ์๋ง๋ ์ด ์๋๋ฆฌ์ค๋ฅผ ํ์ฉํ์ง ์์ผ๋ฉด ์ฝ๋๊ฐ ๋ ์์ ํ ์ ์์ผ๋ฏ๋ก ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํผํ ์ ์๋ค๋ ์ฃผ์ฅ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ ๋ฒ์งธ ๋ชฉ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ ์ ์๋ ๊ทธ๋๋ก ์บก์ฒํ๋ ๊ฒ์ด๋ฉฐ DOM ๋ฐ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ setter์์ ์๋ ๊ฐ์ ๋ณํ๋์ง๋ง getter์์ ํ๋์ ์์ ์ ํ์ ๋ฐํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ์ผ๋ฐ์ ์ธ ๊ดํ์ ๋๋ค. ์ ํ ์์คํ ์์ ์ด๋ฅผ ์บก์ฒํ ์ ์๋๋ก ํ๋ฉด ๊ธฐ์กด ํ๋ ์์ํฌ ๋ฅผ ์๋ ๊ทธ๋๋ก ๋ ์ ํํ๊ฒ ์ค๋ช ํ ์ ์์ต๋๋ค .
์ ์ด๋ Design Limitation
๋ ์ฌ๊ธฐ์์ ์ ๊ฑฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ์ด์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ์ค์ ๋ก ํ๋ก์๋ ์ํํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
https://stackoverflow.com/questions/57948140/typescript-proxy-which-returns-a-different-type-from-get-than-it-takes-for-set
์ด๊ฒ์ ๋ถ๋ช
ํ #33749 .style.display = ...something nullable...
๋ ์ด์ ์ ํ ๊ฒ์ฌ๋ฅผ ํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋ํ ์ด์ ์
๋๋ค. ์ด๋ ๋ฌดํจ์ฑ ์ ํ์ฑ ๋ฌธ์ ๋ก ์ ์๋ฉ๋๋ค. ๊ทธ๊ฑด ์ข ๋ป๋ปํ์ง ์์ต๋๊น? ๋ฒ๊ทธ ์์ ์ผ๋ก ์๋ชป๋ ๋ ์ด๋ธ์ด ์ง์ ๋์์ ๋ ์๋ก์ด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์
ํด์ผ ํ๋ ๊ฒ์ ์ฑ๊ฐ์ ์ผ์
๋๋ค. ๊ฐ์ธ์ ์ผ๋ก, ๋๋ null
์ ๋น ๋ฌธ์์ด์ด ํ๋ ๊ฒ๋ณด๋ค "๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ"์ด๋ผ๋ ํน๋ณํ ๋์์ด ์๋ค๋ ๊ฒ์ด ํจ์ฌ ๋ ๋๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ typescipt 3.7๊น์ง๋ null์ ์ฌ์ฉํ์ฌ ์บก์ฒํ๋ ๊ฒ์ ์ ํธํ์ต๋๋ค. ์ด๋ค ๊ฒฝ์ฐ๋ ์ด ์ ํ์ ํด๊ฒฐํ๊ธฐ ์ํด ์๋์ ์ผ๋ก ์๋ชป๋ ์ ํ ์ฃผ์์ ๋ ์ด๋ธ์ ์ง์ ํ๋ฉด ์
๊ทธ๋ ์ด๋ ๋ฌธ์ ๋ฅผ ๋ถ๋ฅํ๋ ์๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค.
๋ํ ์ด๋ฅผ ์ํ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ์ฐ๋น์ธํธ ์ปจํ ์คํธ์์๋ง ํ์ฉ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? @RyanCavanaugh ๊ฐ ๋ณต์ก์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ๊น์?
์ด์ ๋ํ ๋์ ์ฌ์ฉ ์ฌ๋ก๋ ํ๋ก์๊ฐ ์ฝ์์ ๋ฐํํ์ง๋ง ์ค์ ์์ ์ด ์ฝ์์ ์ค์ ํ์ง ์๋ API๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ง๊ธ์ TypeScript์์ ์ด๊ฒ์ ์ค๋ช ํ ์ ์์ต๋๋ค.
let post = await loadPost()
let user = await loadUser()
post.author = user // Proxy handles links these two objects via remote IDs
await save(post)
// Somewhere else in code
let post = await loadPost()
let author = await post.author
ํ์ ์์ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ด๋ , ์ผ๋ฐ์ ์ธ ํ๋ก์์ด๋ , TypeScript๋ ์ด๋ฌํ ์ ํ์ ๊ธฐ๋ฅ์ด ์ค์์๋ค๋ ์ ์ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ค์ ์ด ๋ชฉ๋ก์์ 6๋ฒ๊ณผ 7๋ฒ์ ์ ๊ฑฐํด์ผ ํฉ๋๋ค(https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals#goals).
set ๋ฉ์๋์์ ํญ๋ชฉ์ ๋ฐฐ์ด๋ก ํธ์ํ๊ณ get ๋ฉ์๋์์ ์ ์ฒด ๋ฐฐ์ด์ ๊ฐ์ ธ์ค๊ณ ์ถ์ต๋๋ค. ์ง๊ธ์ ์ ์๋ํ๋ set myArray(...value: string[])
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ง์ด ๋ถ๋ช์ณค์ต๋๋ค... ์ด ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ ๋ณด ๋๋ ๊ฒฝ๊ณ ๋ ์ด์ ๋ํด ์ ์๋ํฉ๋๋ค.
class MyClass {
_myArray: string[] = [];
set myArray(value: string) {
this._myArray.push(value);
}
get myArray(): string[] {
return this._myArray;
}
}
class MyClass {
_myArray: string[] = [];
set myArray(...value: string[]) {
this._myArray.push(value[0]);
}
get myArray(): string[] {
return this._myArray;
}
}
๋ด๊ฐ ํ์ํ ๋ ์๊ฐํด๋ธ ํ ๊ฐ์ง ํด๊ฒฐ์ฑ
์ ์์ฑ์ union type
๋ก ์ค์ ํ๋ ๊ฒ์ด์์ต๋๋ค. ๋ด ์๊ฐ์ API์์ ๋ฌธ์์ด๋ก ์
๋ ฅ๋์ง๋ง ๋ด UI์ ๋ํ Moment ๊ฐ์ฒด๋ก ์ค์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
class TimeStorage {
_startDate: string | Moment = ""
_endDate: string | Moment = ""
set startDate(date: Moment | string) {
this._startDate = moment(date).utc()
}
get startDate(): Moment | string {
return moment.utc(this._startDate)
}
set endDate(date: Moment) {
this._endDate = moment.utc(date)
}
get endDate() {
return moment.utc(this._endDate)
}
}
๋๋ ํํฐ์ ์กฐ๊ธ ๋ฆ์์ง๋ง ์ต๊ทผ์์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ๊ทธ๊ฒ์ ํฅ๋ฏธ๋ก์ด ๋๋ ๋ง์ด๋ฏ๋ก ์กฐ๊ธ ๋ง์ง์๊ฑฐ๋ฆฌ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋ค๊ณ ์ ํ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ๋ฌธ์์ด๊ณผ ์ซ์(์ด๋ค ์ฉ๋๋ก๋ )๋ฅผ ํ์ฉํ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์์ง๋ง ์์ฑ์ ์ค์ ๋ก ๋ฌธ์์ด๋ก ์ ์ฅ๋์ด ์๋ ๊ฐ๋จํ ํด๋์ค์ ๋๋ค.
class Foo {
constructor() {
this._bar = '';
this.baz = '';
}
// error: 'get' and 'set' accessor must have the same type.(2380)
get bar(): string {
return this._bar;
}
// error: 'get' and 'set' accessor must have the same type.(2380)
set bar(value: string | number) {
this._bar = value.toString();
}
public baz: string;
private _bar: string;
}
์ด๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ณ ์ฌ์ ํ ๊ฐ๋ ฅํ ํ์ดํ์ ์ํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ์ด์ ๋๊ตฐ๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์๋ค๊ณ ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
/**
* Abstract base class for properties.
*/
abstract class Property<GetType, SetType> {
abstract get(): GetType;
abstract set(value: SetType): void;
}
/**
* Proxify an object so that it's get and set accessors are proxied to
* the corresponding Property `get` and `set` calls.
*/
function proxify<T extends object>(obj: T) {
return new Proxy<any>(obj, {
get(target, key) {
const prop = target[key];
return (prop instanceof Property) ? prop.get() : prop;
},
set(target, key, value) {
const prop = target[key];
if (prop instanceof Property) {
prop.set(value);
} else {
target[key] = value;
}
return true;
}
});
}
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ํด๋์ค์ ๋ํ typed ์์ฑ์ ๊ตฌํํ ์ ์์ต๋๋ค.
class Bar extends Property<string, string | number> {
constructor(bar: string | number) {
super();
this.set(bar);
}
get(): string {
return this._bar;
}
set(value: string | number) {
this._bar = value.toString();
}
private _bar: string;
}
class Foo {
constructor() {
this.bar = new Bar('');
this.baz = '';
}
public bar: Bar;
public baz: string;
}
๊ทธ๋ฐ ๋ค์ ์ด ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด bar
์ ๋ํ ์์ ํ getter ๋ฐ setter ์ ํ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
const foo = new Foo();
// use property's typed setter
foo.bar.set(42);
foo.baz = 'foobar';
// use property's typed getter
// output: 42 foobar
console.log(foo.bar.get(), foo.baz);
๊ทธ๋ฆฌ๊ณ ์์ฑ setter ๋๋ getter๋ฅผ ๋ ๋์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ proxify
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ํํ ์ ์์ต๋๋ค.
const foo = new Foo();
// use proxified property setters
Object.assign(proxify(foo), { bar: 100, baz: 'hello world' });
// use property's typed getter
// output: 100 hello world
console.log(foo.bar.get(), foo.baz);
// use proxified property getters
// output: {"bar":"100","baz":"hello world"}
console.log(JSON.stringify(proxify(foo)));
๋ฉด์ฑ ์กฐํญ: ๋๊ตฐ๊ฐ ์ด ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฃ๊ฑฐ๋ ์ํ๋ ๋๋ก ํ๊ณ ์ถ๋ค๋ฉด ์์ ๋กญ๊ฒ ํ์ญ์์ค. ๋๋ฌด ๊ฒ์ผ๋ฅด๋ค.
๋ช ๊ฐ์ง ์ถ๊ฐ ๋ฉ๋ชจ๋ง ํ๋ฉด ์ด ๊ธด ๋ชฉ๋ก์ ์คํธ ๋ฉ์ผ์ ๋ณด๋ด์ง ์๊ฒ ๋ค๊ณ ์ฝ์ํฉ๋๋ค!
์ด๊ฒ์ ์์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐํ๋ฉด:
/**
* Create a property with custom `get` and `set` accessors.
*/
function property<GetType, SetType>(property: {
get: () => GetType,
set: (value: SetType) => void
}) {
const obj = { ...property };
Object.setPrototypeOf(obj, Property.prototype);
return obj;
}
์ฐ๋ฆฌ๋ ์๋ ํด๋์ค์ ์กฐ๊ธ ๋ ๊ฐ๊น์ด ๊ตฌํ์ ์ป์๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ this
์ ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
class Foo {
constructor() {
this._bar = '';
this.baz = '';
}
public bar = property({
get: (): string => {
return this._bar;
},
set: (value: string | number) => {
this._bar = value.toString();
}
});
public baz: string;
private _bar: string;
}
์ธ์์์ ๊ฐ์ฅ ์์ ๊ฒ์ ์๋์ง๋ง ํจ๊ณผ๊ฐ ์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ๊ฐ์ ํ๊ณ ์ค์ ๋ก ๋ฉ์ง ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด ์ค๋ ๋๋ฅผ ์ฝ๋ ๊ฐ์ธ์ด ์ด ๊ธฐ๋ฅ์ด ์ค์ํ๋ค๊ณ ํ์ ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ฅผ ๋๋นํ์ฌ Angular๊ฐ ๋ฐฉ๊ธ ์๊ฐํ ์ด ์์ฒญ๋๊ฒ ์ถํ ํดํน์ ์๋ ค๋๋ฆฝ๋๋ค.
์ฌ๊ธฐ์์ ๊ฐ ์ ํ์ ๋ถ์ธ์์ ๋ถ์ธ|''๋ก ๋ณ๊ฒฝํ์ฌ setter๊ฐ ์ค์ ๋ก ํ์ฉํ๋ ๊ฐ โโ์ธํธ์ ์ผ์น์ํค๋ ๊ฒ์ด ์ด์์ ์ ๋๋ค. TypeScript๋ getter์ setter๊ฐ ๋ชจ๋ ๋์ผํ ์ ํ์ ๊ฐ์ ธ์ผ ํ๋ฏ๋ก getter๊ฐ ๋ถ์ธ์ ๋ฐํํด์ผ ํ๋ ๊ฒฝ์ฐ setter๋ ๋ ์ข์ ์ ํ์ผ๋ก ๊ณ ์ ๋ฉ๋๋ค.... Angular๋ @Input()์ ๋ํด ๋ ๋๊ณ ํ์ฉ์ ์ธ ์ ํ ๊ฒ์ฌ๋ฅผ ์ง์ํฉ๋๋ค. ์ ๋ ฅ ํ๋ ์์ฒด์ ๋ํด ์ ์ธ๋ฉ๋๋ค. ๊ตฌ์ฑ ์์ ํด๋์ค์ ngAcceptInputType_ ์ ๋์ฌ๊ฐ ์๋ ์ ์ ์์ฑ์ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ํ์ฑํํฉ๋๋ค.
````
ํด๋์ค ์ ์ถ ๋ฒํผ {
private _disabled: ๋ถ์ธ;
๋นํ์ฑํ(): ๋ถ์ธ {
์ด๊ฒ์ ๋ฐํํ์ญ์์ค._disabled;
}
๋นํ์ฑํ ์ค์ (๊ฐ: ๋ถ์ธ) {
this._disabled = (๊ฐ === '') || ๊ฐ;
}
์ ์ ngAcceptInputType_disabled: ๋ถ์ธ|'';
}
````
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ฃผ์ธ์ .
๋ค, ๋ฌธ์ ๊ทธ๋๋ก Angular๊ฐ ์ฌ์ฉํ๋ ค๋ ํจํด์ ์ง์ํ๊ธฐ ์ํด ์ด ์ถ์ ํจ์ด ๊ณณ๊ณณ์ ์์ต๋๋ค. ํ์ฌ์ ์ ํ์ ๋๋ฌด ๋ ๋จ์ ์ ๋๋ค.
TS๊ฐ ์น ๋๋์์ ์ ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ฐ ์ฌ์ฉ๋๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ๋ ๋ ๋จ์ ์ธ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ๋์์ธ์ ๋ชจ๋ธ๋งํ์ง ๋ชปํ ๊ฒ์ ๋๋ค.
์ด ์์ ์์ ์ด ๋ฌธ์ ๊ฐ ๋ค์ ์ด๋ฆฌ์ง ์๋ ์ด์ ๋ฅผ ์ ๋ฌํ๋ ์ฑ ์์ ๊ธฐ์ฌ์์๊ฒ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์์ ์์๋ ์ด์ ๋ํด ๊ฐ๋ ฅํ๊ฒ ๋ฐ๋ํ๋ ๊ธฐ๊ณ ์์์ด ์์ต๋๊น?
W3C ์ฌ์๊ณผ ์ผ์นํ๋ NodeJ์ฉ DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ณ ์์ง๋ง ์ด Typescript ๋ฌธ์ ๋ก ์ธํด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ชจ๋ ์ ๋ฐ์ดํธ?
TypeScript์ ํต์ฌ ํ ๋ด ์ผ๋ถ๊ฐ ์ง๊ตฌ์์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ธ DOM์ ์ฌ์์ฑํ๊ธฐ ์ํด ํ์ํ ๊ธฐ๋ฅ์ ๋ฐ๋ํ๋ค๋ ์ฌ์ค์ด ์ ์๊ฒ๋ ์ถฉ๊ฒฉ์ ์ ๋๋ค.
a) W3C DOM ์ฌ์์ ๋ง์ ๋ถ๋ถ์ ๊ตฌํํ๋ ๋์ b) TypeScript์ ์ ํ ์์คํ
์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์ต๋๋ค any
typescriptlang.org์ ํํ์ด์ง๋ ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ ํํ์ง ์์ต๋๋ค.
TypeScript๋ ์ผ๋ฐ JavaScript๋ก ์ปดํ์ผ๋๋ JavaScript์ ์ ํ์ด ์ง์ ๋ ์์ ์งํฉ ์ ๋๋ค.
JavaScript์ DOM ์ฌ์์ ๋ค์ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ TypeScript๊ฐ ์ฌ์ ํ ์์ ์งํฉ ์ด ์๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ ์งํฉ์์ ๋ณด์ฌ์ค๋๋ค.
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์ ๋ @gmurray81 ๋ฐ getter์ ์ ํ์ด setter์ ๊ณต์ฉ์ฒด ์ ํ์ ํ์ ์งํฉ์ด์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ ๋ง์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฐ๊ฒฐ๋์ง ์์ ์
๋ ฅ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด setter์ ํจ์๊ฐ getter์ ์ ํ์ ์์์ํค์ง ์๊ณ ์
๋ ฅ์ ์ ๋ฆฌํ ์ ์์ต๋๋ค(์: any
์ฌ์ฉ์ ์์กดํด์ผ ํจ).
์ฌ๊ธฐ ๋ด๊ฐ ํ ์์๋ ์ผ์ด ์์ต๋๋ค. JS์์๋ ๋น์ทํ ์์ ์ ์ํํ์ง๋ง TS์์๋ ํ ์ ์๋ ๊ฐ๋จํ ์์ ์ ๋๋ค.
์ค์ ๋ก ๊ตฌํํ ์ ์๋ 4๋ ๋ฌธ์ .
export const enum Conns {
none = 0, d = 1, u = 2, ud = 3,
r = 4, rd = 5, ru = 6, rud = 7,
l = 8, ld = 9, lu = 10, lud = 11,
lr = 12, lrd = 13, lru = 14, lrud = 15,
total = 16
}
class Tile {
public connections = Conns.none;
get connLeft() { return this.connections & Conns.l; };
set connLeft(val: boolean) { this.connections = val ? (this.connections | Conns.l) : (this.connections & ~Conns.l); }
}
์ง๊ธ ์ด ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค. ์๋๋ @calebjclark ๋ฅผ ์ธ์ฉํ๋ ํฉ๋ฆฌ์ ์ธ ํด๊ฒฐ์ฑ ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์ ๋ @gmurray81 ๋ฐ getter์ ์ ํ์ด setter์ ๊ณต์ฉ์ฒด ์ ํ์ ํ์ ์งํฉ์ด์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ ๋ง์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฐ๊ฒฐ๋์ง ์์ ์ ๋ ฅ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด setter์ ๊ธฐ๋ฅ์ด getter์ ์ ํ์ ํ๊ดดํ์ง ์๊ณ ์ ๋ ฅ์ ์ ๋ฆฌํ ์ ์์ต๋๋ค(์ฆ, any๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ).
getter๊ฐ setter ์ ํ์ ํ์ ์งํฉ์ด๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ๊ฒ ์ ํ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ค์ ๋ก ๊ตฌํ์ด ํญ์ getter ์ ํ์ ํ์ ์ ํ์ ๋ฐํํ๋ ํ setter ์ ํ์ ์ด๋ก ์ ์ผ๋ก ๋ง ๊ทธ๋๋ก ๋ฌด์์ด๋ ๋ ์ ์์ต๋๋ค. setter๊ฐ getter ์ ํ์ ์์ ์ ํ์ด ๋๋๋ก ์๊ตฌํ๋ ๊ฒ์ ์ด ํฐ์ผ์ ์ ์๋ ๋ช ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถฉ์กฑํ ์ ์์ง๋ง ๋์ค์ ๋ฐ๋์ ๋ถ๋ง์ ์ ๊ธฐํ ์ ์๋ ์ผ์ข ์ ์ด์ํ ์ ํ์ ๋๋ค.
์ฆ, ํด๋์ค๋ ์์์ ์ผ๋ก ์ธํฐํ์ด์ค์ด๊ธฐ๋ ํ๋ฉฐ getter ๋ฐ setter๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ์ด์ค์ ํ์๋์ง ์๋ ๊ตฌํ ์ธ๋ถ ์ ๋ณด์
๋๋ค. OP์ ์์์๋ type MyClass = { myDate(): moment.Moment; }
๋ก ๋๋ฉ๋๋ค. ์ด ์๋ก์ด getter ๋ฐ setter ์ ํ์ ์ธํฐํ์ด์ค์ ์ผ๋ถ๋ก ์ด๋ป๊ฒ๋ ๋
ธ์ถํด์ผ ํ์ง๋ง ๊ทธ๊ฒ์ด ๋ฐ๋์งํ ์ด์ ๋ฅผ ๊ฐ์ธ์ ์ผ๋ก ์์ง ๋ชปํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก =
๋ฐ ===
์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ๋ ์ ํ๋ ๋ฒ์ ์ ์๊ตฌํฉ๋๋ค. (Getter์ setter๋ ์ด๋ฏธ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์
๋๋ค.) ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ธ์ด๋ก ์ฐ์ฐ์ ์ค๋ฒ๋ก๋๋ฅผ ์ฒ๋ฆฌํ ์ฌ๋์ผ๋ก์ ์ ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํผํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌผ๋ก ๋๊ตฐ๊ฐ๋ ๋ฐ์นด๋ฅดํธ ๋ฐ ๊ทน์ ๊ณผ ๊ฐ์ ์ํ์ ์์ ๋ฅผ ์ ์ํ ์ ์์ง๋ง TS๋ฅผ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ(์ด ์ค๋ ๋์ ์์ ํฌํจ) ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ด ํ์ํ ๊ฒ์ ์๋ง๋ ์ฝ๋ ๋์์ผ ๊ฒ์
๋๋ค. API๋ฅผ ๋ ๋จ์ํ๊ฒ ๋ง๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ๊ทธ ๋ฐ๋์ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์์์ ์ธ๊ธํ๋ฏ์ด ๋ค์์ด ๋ฐ๋์ ์ฌ์ค์ด ์๋ ๊ฒ์ ๋งค์ฐ ํผ๋์ค๋ฝ๊ณ ์ง๊ด์ ์ด์ง ์์ต๋๋ค.
foo.x = y;
if (foo.x === y) { // this could be false?
(๋ด ์๊ฐ์ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ด๋ setter๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ก๊น ๊ณผ ๊ฐ์ฒด์ "dirty" ํ๋๊ทธ๋ฅผ ์ค์ ํ์ฌ ๋ค๋ฅธ ๊ฒ์ด ํ๋๊ฐ ๋ณ๊ฒฝ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ ์๋๋ก ์ค์ ํ๋ ๊ฒฝ์ฐ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ ์ค ์ด๋ ๊ฒ๋ ์ค์ ๋ก ๊ณ์ฝ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ๋ฌผ์ฒด.)
@MikeyBurkman
[...] ํ์ง๋ง TS๋ฅผ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ(์ด ์ค๋ ๋์ ์์ ํฌํจ), ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ด ํ์ํ ๊ฒ์ ์๋ง๋ ์ฝ๋ ๋์๋ผ๊ณ ์ฃผ์ฅํ ๊ฒ์ ๋๋ค. [...]
foo.x = y; if (foo.x === y) { // this could be false?
๋ฐ๋ผ์ ์ ํ์ด ์ผ์นํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋๋ผ์ด ๋์์ ๋ฐฉ์งํ ์ ์์ผ๋ฉฐ ์ค์ ๋ก el.style.display = ''; //so is this now true: el.style.display === ''?
๋ ์ด๊ฒ์ด ์ด๋ก ์ ์ธ ๊ฒ๋ ์๋์ ๋ณด์ฌ์ค๋๋ค. ํ๋ฒํ ์ค๋๋ ํ๋์ ๊ฒฝ์ฐ์๋ NaN์ ๋ํด์๋ ๊ฐ์ ์ด ์ฑ๋ฆฝํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ ์ค์ํ ๊ฒ์ TS๊ฐ DOM๊ณผ ๊ฐ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ํฌํจํ์ฌ ๊ธฐ์กด JS API์ ์ํธ ์ด์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ TS๊ฐ ์ด๋ฌํ ์ฌํญ์ ๋ํด ์๊ฒฌ์ ์ ์ ํ ์ ์๋ค๋ ์ ์ ๋ฌด์ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ API๊ฐ ์ด์์ ์ธ์ง ์ฌ๋ถ๋ ์ค์ํ์ง ์์ต๋๋ค. ์ค์ํ ๊ฒ์ TS๊ฐ ๊ทธ๋ฌํ ์ฃผ์ด์ง API์ ๊น๋ํ๊ฒ ์ํธ ์ด์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด์ API๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ํด๋ฐฑ ๋ ผ๋ฆฌ๋ฅผ ๋ค์ ๊ตฌํํ์ฌ setter์ ์ ๋ฌ๋ getter ์ ํ ์ด์ธ์ ๊ฐ์ ๊ฐ์ ์คํํ์ฌ ์์ฑ์ getter ์ ํ์ผ๋ก ์ ๋ ฅ ํ๊ฑฐ๋ ์ ํ ๊ฒ์ฌ๋ฅผ ๋ฌด์ํ์ฌ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๊ฐ getters ์ฌ์ดํธ์์ ์ธ๋ชจ์๋ ์ ํ ์ด์ค์ ์ ์ฌ์ฉํ๋ฏ๋ก ์์ฑ์ setters ์ ํ์ผ๋ก ์ ๋ ฅํ์ญ์์ค. ๋๋ ๋ ๋์ ๊ฒ์ TS๊ฐ ์ด์์ ์ธ์ง ์ฌ๋ถ ์ ๊ด๊ณ์์ด DOM์ ์ฃผ์์ ์ถ๊ฐํ๊ธฐ ์ํด ์ ํํ๋ ๋ชจ๋ ์ผ์ ์ํํ๋ ๊ฒ์ ๋๋ค.
๊ทธ ์ ํ์ ๋ชจ๋ ๋์๋ค. ์ด๋ฅผ ํผํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ JS API๋ฅผ ๊ฐ๋ฅํ ํ ์ถฉ์คํ๊ฒ ํํํด์ผ ํ ํ์์ฑ์ ๋ฐ์๋ค์ด๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์์๋ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค (์ด๋ฅผ ๊ฒฐ์ ์ ์ผ๋ก ์ค์ํ์ง ์๊ฒ ๋ง๋ค ์ ์๋ TS ๋ด๋ถ์ ๋ํ ์ง์ ์์ด๋).
๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค(์ด๋ฅผ ๊ฒฐ์ ์ ์ผ๋ก ์ค์ํ์ง ์๊ฒ ๋ง๋ค ์ ์๋ TS ๋ด๋ถ์ ๋ํ ์ง์ ์์ด๋ ์ธ์ ํจ)
๋๋ ๊ทธ๋ค์ด ๋ ์ต๊ทผ์ ํ์ฑํ ํ ์๋ก์ด ์ ํ ์ ์ธ ๊ตฌ๋ฌธ ์ค ์ผ๋ถ๊ฐ ์ด์ ์ ์คํ ๊ฐ๋ฅํ์ง ์์์ ๋ ์ด๊ฒ์ ํํํ ์ ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ฌ๋ ๊ฒ์ ์ค์ ๋ก ๊ณ ๋ คํด์ผ ํฉ๋๋ค... @RyanCavanaugh
์ด์์ ์ธ ์ธ๊ณ์์ TS๋ ๋ชจ๋ JS API์ ์ํธ ์ด์ฉ๋ฉ๋๋ค. ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. TS์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฅํ ์ ์๋ ๋ง์ JS ๊ด์ฉ๊ตฌ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๋ค์ด ๋ ๋์ ๊ฒ์ด ์๋๋ผ ์ค์ ๋ก ๋ ๋์ ํ๋ก๊ทธ๋๋ฐ ๊ด์ฉ๊ตฌ๋ก ์ด์ด์ง๋ ๊ฒ์ ์์ ํ๋ ๋ฐ ์ง์คํ๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ ์ ์ ์ ์ผ๋ก ์ง์ํ๋ ๊ฒ๋ ์ข์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก ์ ํ๋ ์๊ฐ์ ๋จผ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ข์ 12๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๊ทธ ๋ชฉ๋ก์์ ํจ์ฌ ์๋์ ์์ต๋๋ค.
@MikeyBurkman ์ฐ์ ์์ ์ง๋ฌธ์ ์ ํจํฉ๋๋ค. ์ ์ฃผ์ ๊ด์ฌ์ฌ๋ @RyanCavanaugh ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๊ณ ์ญ์ ํ๊ธฐ๋ก ํ ๊ฒฐ์ ์ ๋๋ค. ์ด ์ค๋ ๋์์ ์ง์ ํ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ Typescript์ ๋ช ์๋ ์ฌ๋ช ๊ณผ ์ง์ ์ ์ผ๋ก ์ถฉ๋ํฉ๋๋ค. ์ด๋ Javascript์ "์์ ์งํฉ"(ํ์ ์งํฉ ๋์ )์ด ๋๋ ๊ฒ์ ๋๋ค.
์, ์ด ๋ฌธ์ ๋ _์๋ง๋_ ๊ฒฐ๊ตญ ์์ ๋์ด์ผ ํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋์ด์๋ ์ ๋๋ค๋ ๋ฐ ๋์ํ ์ ์์ต๋๋ค. (์ฌ์ค ๊ทธ๋ ๊ฒ ๋ ์ง๋ ์๋ฌธ์ด์ง๋ง.)
์ด๊ฒ์ ์ ์ ์ ์ผ๋ก ์ง์ํ๋ ๊ฒ๋ ์ข์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก ์ ํ๋ ์๊ฐ์ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์์ญ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
๊ธฐ์กด DOM API์ ๊ธฐ์กด JS API๋ฅผ ๋ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค๋ ์ ์์ TypeScript์ ์ค์ํ ์ธก๋ฉด์ ๊ณผ์ํ๊ฐํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๊ฑฐํ ๋ด์์ ์์ ์ ์ฝ๋ ์ด์์ ์์ ํ๊ฒ ์ ์งํ๊ธฐ ์ํด ์กด์ฌํฉ๋๋ค.
๋ด ๊ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํ๊ณ , ๋ด druthers์๊ฒ ์ฃผ์ด์ง setter/getter ๊ฐ์ ๋ถ์ผ์น๋ฅผ ์๋์ ์ผ๋ก ๋ฐ์์ํค์ง๋ ์์ ๊ฒ์ ๋๋ค. ๋๋๋ก ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ์๋ฆฌ์์ ๋ค๋ฅธ ์์คํ ๊ณผ ์ธํฐํ์ด์คํด์ผ ํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฐ์ ๋ก ์์ ๋๋๋ค. ์๋ฅผ ๋ค์ด Angular๋ ๋์ ์ ํ์ ๋ํ ์ง์์ ๊ธฐ๋ฐ์ผ๋ก ์ ํ ๊ฐ์ ๋ณํ์ ์ํํ๊ธฐ๋ณด๋ค๋ ๋งํฌ์ ์์ ์ค๋ ๊ตฌ์ฑ ์์์ ๋ชจ๋ ์ ๋ ฅ ์์ฑ์ ๋ฌธ์์ด๋ก ์ค์ ํฉ๋๋ค(์ต์ํ ๋ง์ง๋ง์ผ๋ก ํ์ธํจ). ๊ทธ๋์, ๋น์ ์ ๋ฌธ์์ด์ ๋ฐ์๋ค์ด๊ธฐ๋ฅผ ๊ฑฐ๋ถํฉ๋๊น? ์ ํ์ ์ฌ์ฉํ๊ธฐ ๋์ฐํ๊ฒ ๋ง๋ค๋๋ผ๋ ๋ชจ๋ ๊ฒ์ ๋ฌธ์์ด๋ก ๋ง๋์ญ๋๊น? ์๋๋ฉด TypeScript๊ฐ ์ํค๋ ๋๋ก ํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ ์ฌ์ฉํฉ๋๊น? string | ์์์ ์ง์ ํ์ง๋ง ๊ฒํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ฐํฉ๋๋ค. ์ด๊ฒ๋ค์ ๋ชจ๋ ํ์ ์์คํ ์ ์ฝ๊ฐ์ ์ถ๊ฐ ํํ์ด ๋์์ด ๋์์ ๋ ์์ ์ฑ์ ๊ฐ์์ํค๋ ๋งค์ฐ ๋์ฐํ ์ต์ ์ ๋๋ค.
๋ฌธ์ ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ด Angular๋ง์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค. Angular๋ ์์ฑ ์งํฉ์์ ์๋ ๊ฐ์ ๋ณํ์ด ๋ฐ์ํ๋ DOM์ ๋ง์ ์๋๋ฆฌ์ค๋ฅผ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ํฉ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง getter๋ ํญ์ ์์๋๋ ๋จ์ผ ์ ํ์ ๋๋ค.
์ฐธ๊ณ ๋ก Angular๋ ์๊ฐ๋ณด๋ค ํจ์ฌ ๋์ฉ๋๋ค .
๋์๊ฒ ๊ทธ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ํค-๊ฐ ์์ ์ ์ฅํ ์ ์๋ ์ผ๋ถ ๋ฒ์ฉ ์ ์ฅ์ ์ฃผ์์ ๋ํผ๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉ์๋ฅผ ํน์ ํค๋ก ์ ํํ๋ ค๋ ๊ฒฝ์ฐ์ ๋ฌธ์ ์ ๋๋ค.
class Store {
private dict: Map<string, any>;
get name(): string | null {
return this.dict.get('name') as string | null;
}
set name(value: string) {
this.dict.set('name', value);
}
}
๊ฐ์ด ์ด์ ์ ์ค์ ๋์ง ์์์ง๋ง null
๋ก ์ค์ ํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ null
๋ฅผ ์ป์ ์ ์์ต๋๋ค. ํ์ฌ๋ก์๋ setter ์
๋ ฅ ์ ํ์ null
๊ฐ ํฌํจ๋์ด์ผ ํ๋ฏ๋ก ํ ์ ์์ต๋๋ค.
@fan-tom, ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด์ผ ํ๋ ์ด์ ์ ๋ํ ํ๋ฅญํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค! ๊ณ์ ์ค์ธ์.
์ด ๋ฌธ์ ๋ ๋งค์ฐ ๋์ ํฌํ ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค!
์ด๊ฒ์ TSํ์ ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ ์ํ๋ ๋๋ก ๋ง์๊ป ์ฆ๊ธธ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธ๋ถ ์ฌ์ฉ์ ์ปค๋ฎค๋ํฐ์ ์ด ๊ธฐ๋ฅ์ ์ต๋ํ ์ ์ฉํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค๋ฉด TS ํ์ด ์ปค๋ฎค๋ํฐ์ ๋์ ํฌํ ์๋ฅผ ๊ฐ๋ ฅํ๊ฒ ๊ณ ๋ คํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
typescriptlang.org์ ํํ์ด์ง๋ ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ ํํ์ง ์์ต๋๋ค.
TypeScript๋ ์ผ๋ฐ JavaScript๋ก ์ปดํ์ผ๋๋ JavaScript์ ์ ํ์ด ์ง์ ๋ ์์ ์งํฉ ์ ๋๋ค.
TypeScript๋ ์ผ๋ฐ JavaScript๋ก ์ปดํ์ผ๋๋ JavaScript _subset_์ ์ ํ์ด ์ง์ ๋ _superset_์ ๋๋ค. : ์ค๋ง์ผ :
TypeScript๋ ์ผ๋ฐ JavaScript๋ก ์ปดํ์ผ๋๋ JavaScript ํ์ ์งํฉ์ ์ ํ์ด ์ง์ ๋ ์์ ์งํฉ์ ๋๋ค.
์ข ๋ ์ธ๊ต์ ์ผ๋ก ๋งํ์๋ฉด, ํ์ด ์ ํ ์์คํ ๋ชจ๋ธ๋ง์์ ์ด๋ฐ ์ข ๋ฅ์ ๋ ๋จ์ ์ธ ์๋ต์ ํ ๋ JavaScript์ ๋ ๋จ์ ์ธ ์์ ์งํฉ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
๊ทธ๋ค์ "์ฐ๋ฆฌ๊ฐ ํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ชจ๋ธ๋งํ์ง ์์ ๊ฒ์ด๋ฉฐ, ์ด์จ๋ ๋น์ ์ด ํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค"๋ผ๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฌ๋ JavaScript๋ _ํด์๋ ์ ๋๋_ ์ผ๋ค๋ก ๊ฐ๋ ์ฐจ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก Typescript๋ ์์ง์ ๋ ธํ์ฐ๊ฐ ์๋ค๋ฉด ์ด๋ฌํ ์ผ์ ํ๋ ๊ฒ์ ์ฐจ๋จํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ์ผ๋ฐ์ ์ธ ์ ๋ต์ JavaScript์ ๋ํด ๋ ๋จ์ ์ด์ง ์๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค. Typescript๋ก ์คํํ ์ ์๊ณ ์คํํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด API๊ฐ setter ๊ธฐ๋ฐ ๊ฐ์ ๋ณํ์ ์ํํ์ง ์์์ผ ํ๋ค๋ ๋ฏฟ์์ ์ธ์ฉํ๋ฉด์ ์ด ์ผ๋ฐ์ ์ธ(DOM์์ ์ฌ์ฉ๋๋) ์๋๋ฆฌ์ค๋ฅผ ๋ชจ๋ธ๋งํ๋ ๊ฒ์ ๊ฑฐ๋ถํ๋ ๊ฒ์ด ์ด์ํ ์ด์ ์ ๋๋ค.
ํ์ฌ ์ด๊ฒ์ ๋ถ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
class MyClass { private _myDate: moment.Moment; get myDate(): moment.Moment { return this._myDate; } set myDate(value: moment.Moment) { assert.fail('Setter for myDate is not available. Please use: setMyDate() instead'); } setMyDate(value: Date | moment.Moment) { this._myDate = moment(value); } }
๋น์ ์ด ํ ์ ์๋ ์ต์ ์ ์์ฑ์๋ฅผ ์ถ๊ฐํ๊ณ ๊ฑฐ๊ธฐ์์ ์ปค์คํ setter ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋๋ค. ๋ง์ฝ ๊ทธ๊ฒ์ด ๋น์ ์ด ๊ทธ ๊ฐ์ ์ค์ ํ๋ ์ ์ผํ ์๊ฐ์ด๋ผ๋ฉด.
constructor(value: Date | moment.Moment) {
this.setMyDate(value);
}
๊ฐ์ ์ง์ ํ ๋นํ ๋์ ๋ฌธ์ ๋ ์ฌ์ ํ ๋จ์ ์์ต๋๋ค.
5.5๋ ์ด ์ง๋ ํ ์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@xhliu ๋ ๋ ์ด๋ธ์์ ์ ์ ์๋ฏ์ด ๋๋ฌด ๋ณต์กํ์ฌ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ์ค๊ณ ์ ํ ์ฌํญ์ด๋ฏ๋ก ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋์์ต๋๋ค. ๋๋ ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ซํ ๋ฌธ์ ์ ์๊ฐ ๊ธธ์ด๋ ์ผ์ข ์ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ค์ ์ด์ด์ฃผ์ธ์. ๋ํ ์ด๊ฒ์ ์ธํฐํ์ด์ค ์์ค์์ ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค. ๊ณ ์ ์ ์ธ ์๋ ์ฝ๊ณ ์ธ ์ ์๋ ๊ฒ์ ๋ํด ์์ ํ ์ ์ฐ์ฑ์ด ์๋ ํ๋ก์๋ฅผ ๊ตฌํํ ๋์ ๋๋ค.
@xhliu ... ๋๋ฌด ๋ณต์กํด์ ๋ค๋ฃจ๊ธฐ ์ด๋ ต์ต๋๋ค...
https://ts-ast-viewer.com/#code/MYewdgzgLgBFCm0DyAjAVjAvDA3gKBkJgDMQQAuGAIhQEManKvAXzzwWXQDpSQg
const testObj = {
foo: "bar"
}
testObj.foo
๊ธฐํธ foo๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
foo
flags: 4
escapedName:"foo"
declarations: [
PropertyAssignment (foo)
]
valueDeclaration: PropertyAssignment (foo)
์ฌ๊ธฐ์๋ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ํ ๊ณต๊ฐ์ด ๋ง์ด ์์ผ๋ฉฐ ์ด๋ TS๋ฅผ ์ํ ํ๋ฅญํ ๋์์ธ์ ๋๋ค. ์ด๊ฒ์ ์ค๊ณํ ์ฌ๋์ ์๋ง๋ ๋ฏธ๋์ ์ถ๊ฐ ๊ธฐ๋ฅ(์ฌ์ง์ด ํฐ ๊ธฐ๋ฅ๋ ํฌํจ)์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ํน๋ณํ ๊ทธ๋ ๊ฒ ํ์ ๊ฒ์ ๋๋ค.
์ด ์์ ๋ถํฐ ์ถ์ธก:
์์ฌ ์ฝ๋ ์์ ์ ๊ฒฝ์ฐ accessDelclaration: AccessSpecification (foo)
๋ฅผ ์ ์ธํ ์ ์์ผ๋ฉด foo ๊ธฐํธ์ ํด๋น ์ ์ธ์ ์ธ์ํ๋ PropertyAccessExpression
๊ฐ "accessDelclaration" ๋ฐ ๋์ ์
๋ ฅ์ ์ฌ์ฉํ์ญ์์ค.
accessDelclaration
์์ฑ์ "foo" ๊ธฐํธ์ ์ถ๊ฐํ๋ ๊ตฌ๋ฌธ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด PropertyAccessExpression์ ts.createIdentifier("foo")
์์ ๊ฐ์ ธ์ค๋ ๊ธฐํธ์์ "AccessSpecification"์ ๊ฐ์ ธ์์ ๋ค๋ฅธ ์ ํ์ ์์ฑํ ์ ์์ด์ผ ํฉ๋๋ค.
ts.createPropertyAccess(
ts.createIdentifier("testObj"),
ts.createIdentifier("foo")
)
์ถ์ธก์ปจ๋, ์ด ๋ฌธ์ ์ ๊ฐ์ฅ ์ด๋ ค์ด ๋ถ๋ถ์ ๊ตฌ๋ฌธ(๋๋ ์๋ง๋ ํ์ฌ ์ฒ ํ?)๊ณผ ๊ด๋ จ๋ ์์ ๊ฑฐ ์ฌ๊ณ ์ ์์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ง๋ง ๊ตฌํ ๊ด์ ์์๋ ๋๊ตฌ๊ฐ ๋ชจ๋ ์์ด์ผ ํฉ๋๋ค. ts.createPropertyAccess()
ํจ์์ ๋จ์ผ ์กฐ๊ฑด์ด ์ถ๊ฐ๋๊ณ ํด๋น ์กฐ๊ฑด๊ณผ ๊ทธ ํจ๊ณผ๋ฅผ ๋ํ๋ด๋ ์ ์ธ ํด๋์ค๊ฐ ๊ฐ์ฒด ์์ฑ์ ๊ธฐํธ์ ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ์ ์คํ ํ์ํ ์ด์ (ํนํ DOM ๋ฐ Angular์ ๊ฒฝ์ฐ)์ ์ข์ ์๊ฐ ๋ง์ด ์์ฑ๋์์ต๋๋ค.
string
๋ฅผ window.location
์ ํ ๋นํ๋ ๊ฒ์ด ์๋ํ์ง ์๊ณ as any
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ํํด์ผ ํ๋ TS๋ก ์ด์ JS ์ฝ๋๋ฅผ ๋ง์ด๊ทธ๋ ์ด์
ํ ๋ ์ค๋ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช์์ต๋๋ค. ๐
Window.location ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋ฌธ์์ ํ์ฌ ์์น์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋ Location ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
Window.location์ ์ฝ๊ธฐ ์ ์ฉ Location ๊ฐ์ฒด์ด์ง๋ง ์ฌ๊ธฐ์ DOMString์ ํ ๋นํ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์์น๊ฐ ๋ฌธ์์ด์ธ ๊ฒ์ฒ๋ผ ์์ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. location = ' http://www.example.com '์ location.href = ' http://www.example.com '์ ๋์์ด์ ๋๋ค. .
์์ฒ
string
๋ฅผwindow.location
์ ํ ๋นํ๋ ๊ฒ์ด ์๋ํ์ง ์๊ณas any
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ํํด์ผ ํ๋ TS๋ก ์ด์ JS ์ฝ๋ ๋ง์ด๊ทธ๋ ์ด์
์ข์ ์์ ๋๋ค.
TS๋ ์ด๊ฒ์ด ํ์ํฉ๋๋ค. ์ด๊ฒ์ JavaScript์ ๋งค์ฐ ์ ์์ ์ธ ๋ถ๋ถ์ ๋๋ค.
ํ์ฌ ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋์์์ ์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ ๊ฐ ์๊ธฐ๋ก๋ ์ด ๊ธฐ๋ฅ์ด ์คํ๋์ง ์์์ต๋๊น?
@AGluk , ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค๋ฅธ ์ ํ์ JavaScript getter ๋ฐ setter๋ ์๋ฒฝํ๊ฒ ์ ํจํ๊ณ ํ๋ฅญํ๊ฒ ์๋ํ๋ฉฐ ์ด๊ฒ์ด ์ด ๊ธฐ๋ฅ์ ์ฃผ์ ์ด์ /๋ชฉ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. TypeScript๋ฅผ ๊ธฐ์๊ฒ ํ๊ธฐ ์ํด
setMyDate()
๋ฅผ ์ ๊ณตํด์ผ ํ๋ ๊ฒ์ ๊ทธ๊ฒ์ ๋ง์นฉ๋๋ค.๋ค์ ํจํด์ ๋ฐ๋ฅด๋ ์์ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ ์๊ฐํด ๋ณด์ญ์์ค. .d.ts๋ ๊ณต์ฉ์ฒด ๋๋
any
๋ฅผ ๋ ธ์ถํด์ผ ํฉ๋๋ค.๊ทธ๋ฐ ๋ค์ ์ด ์ ํ์ด ์์ ๋๊ณ ์ด ๋ฌธ์ ๊ฐ ๊ณ์ ์ด๋ ค ์์ด์ผ ํฉ๋๋ค.