Typescript: typeof this.xxx๋Š” "์‹๋ณ„์ž ์˜ˆ์ƒ"์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2014๋…„ 12์›” 24์ผ  ยท  19์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

image

์ด๊ฒƒ์€ ์˜๋„ ๋œ ๊ฒƒ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ์ž…๋‹ˆ๊นŒ?

Suggestion help wanted

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

@ sam-s4s ์š”์ฆ˜์—๋Š” CMultiDataset<this["thing"]> ๋Œ€์‹  ์“ธ ์ˆ˜์žˆ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์‹ฑ ๋œ ์•ก์„ธ์Šค๋Š” typeof ์™€ ๋‹ฌ๋ฆฌ this (๋‹คํ˜•์„ฑ, ์ง์ˆ˜)์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์‹œ๋„ํ–ˆ์ง€๋งŒ TypeScript 3.4.4์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ @ sam-s4s์˜ ํ•˜๋‚˜๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ( ClassName['thing'] ). "ClassName"๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์‹  this ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋‘˜ ๋‹ค ๋งํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค ... try "var copy = typeof (this.data = {});"... ์ด๊ฒƒ์„ ๋งํ•œ ํ›„, ๋‚˜๋Š”์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ๊ทธ๊ฒƒ์€ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค .. .

@giancarloa ํ , ๊ทธ ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ํ”„๋กœ๋•์…˜์˜ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ตœ์†Œํ•œ์˜ ๋ฌธ์ œ ํŠธ๋ฆฌ๊ฑฐ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ this ๋ฅผ ๊ทธ ์ด์™ธ์˜ ๊ฒƒ์œผ๋กœ ๊ฐ€์ ธ ๊ฐ€๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๊ณ  ์˜ค๋ฅ˜๊ฐ€๋ณด๊ณ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ

class Test {
    static data = {};
    constructor() {
        var copy: typeof Test.data = {};
    }
}

์‚ฌ์–‘์— ๋”ฐ๋ผ

_TypeQueryExpression : _
_ ์‹๋ณ„์ž _
_TypeQueryExpression_ . _IdentifierName_

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”

function foo() {
    var x: typeof this.x;
}

this ๋” ๋งŽ๊ฑฐ๋‚˜ ์ ์€ ์œ ํ˜•์ด any ์ด๋ฏ€๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค์—์„œ๋Š” ์˜๋ฏธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ # 229๊ฐ€ ์—†์œผ๋ฉด ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@DanielRosenwasser OO ํ  ... ์‚ฌ์–‘ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ณ ๋ คํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋กค.

๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํšŒ์›์ด ๋น„๊ณต๊ฐœ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

self = this;
var x: typeof self.data;

์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ง€์›๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค
var a : typeof this.x = 1;

๊ทธ๋ฆฌ๊ณ  ์žฌ๊ท€ ์  ์œ ํ˜•์˜ ๋ฉค๋ฒ„๋Š” ์˜ค๋ฅ˜๋กœ ์ด์–ด์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ.

๋ฌธ๋ฒ•์„ ๋ฐ”๊พผ๋‹ค๋ฉด ์ด๊ฒƒ์ด ํšจ๊ณผ๊ฐ€์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ์ด์ง€๋งŒ ๋‚ด๊ฐ€ ์ค€ ๋งฅ๋ฝ์—์„œ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ํ•„์—ฐ์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  any ๋ฅผ ๊ทธ๋“ค์˜ ์œ ํ˜•์œผ๋กœ ์–ป๋„๋ก ์ด๋Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ์ ์œผ๋กœ ์ •ํ™•ํ•˜๋‹ค๊ณ ํ•ด์„œ ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. IMO.
๊ทธ๋Ÿฌ๋‚˜์ด ์›์ธ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

foo ์œ ํ˜•์ด any ์ธ typeof foo.bar ๋ฅผ ์ด๋ฏธ ์ž‘์„ฑํ•˜๋„๋ก ํ—ˆ์šฉํ–ˆ์œผ๋ฉฐ ๋‹ค์Œ ์œ ํ˜•์ด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๋•Œ ๋‹ค๋ฅธ ์  ํ‘œํ˜„ ์œ„์น˜์— ์ด๋ฏธ this.x ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. this ์€ any ์ž…๋‹ˆ๋‹ค. typeof this.x ์˜ ๊ต์ฐจ๋กœ๊ฐ€ ์™œ ์˜ˆ์™ธ๋ฅผ ์ธ์ •ํ•ด์•ผํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด. ์–ผ๋งˆ ์ „์— lodash์— ๋Œ€ํ•œ ์œ ํ˜• ์ •์˜๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ์ง€์›๋˜๋Š” ์„œ๋ช… ์ค‘ ์ผ๋ถ€๋Š” ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์˜ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์„ ์ด๋ ‡๊ฒŒ ์„ ์–ธํ–ˆ๋‹ค :

interface LoDashArrayWrapper<T> {
    rest(): LoDashArrayWrapper<T>;
    rest(
        callback: ListIterator<T, boolean>,
        thisArg?: any): LoDashArrayWrapper<T>;
    rest(n: number): LoDashArrayWrapper<T>;
    rest(pluckValue: string): LoDashArrayWrapper<T>;
    rest(whereValue: {}): LoDashArrayWrapper<T>;

    drop: typeof rest;

    tail: typeof rest;
}

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „ 1.0์—์„œ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ์ด์ƒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ํ‘œํ˜„ํ•˜๋Š” TypeQueryExpression์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋ณ„์นญ์— ๋Œ€ํ•œ ์ „์ฒด ์„œ๋ช… ์ง‘ํ•ฉ์„ ๋ณต์ œํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ์˜ต์…˜์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@juanevp ๊ธฐ๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

interface LoDashArrayWrapper<T> {
    rest: LoDashArrayWrapperOperation<T>;
    drop: LoDashArrayWrapperOperation<T>;
    tail: LoDashArrayWrapperOperation<T>;
}

interface LoDashArrayWrapperOperation<T> {
    (): LoDashArrayWrapper<T>;
    (
        callback: ListIterator<T, boolean>,
        thisArg?: any): LoDashArrayWrapper<T>;
    (n: number): LoDashArrayWrapper<T>;
    (pluckValue: string): LoDashArrayWrapper<T>;
    (whereValue: {}): LoDashArrayWrapper<T>;
}

์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ž˜๋„ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ _this = this ๋ฐฉ์ถœ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด [ts] Identifier expected. ๋ฅผ๋ฐ›์Šต๋‹ˆ๋‹ค.

class UserState {
    <strong i="7">@observable</strong> state = {
        name : "",
        id : "",
    };

    <strong i="8">@action</strong>
    changeUser(user: typeof this.state) { // Error is here
        Object.assign(this.state, user);
    }
}

export const userState = new UserState();

์œ„์˜ ๊ฒฝ์šฐ this.state ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ  ๋‚˜๋Š” ๋ฐฉ๊ธˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค :(

ํด๋ž˜์Šค์—์„œ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ„์˜ ์œ ํ˜•์ด์–ด์•ผํ•˜๋Š” ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

thing = {
    a: 1,
    b: 2
};
multi: CMultiDataset<typeof this.thing>;

์ด ๊ฒฝ์šฐ ์ •์  ๋ณ€์ˆ˜๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  typeof ClassName.thing ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ฐ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ multi ๋Š” ํด๋ž˜์Šค ๋ณ€์ˆ˜ ์—ฌ์•ผํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค ์„ ์–ธ์‹œ ํ•ด๋‹น ์œ ํ˜•์„ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh @DanielRosenwasser @mhegazy ๋Š” ๋น„๊ต์  ์‰ฌ์šด ์ˆ˜์ •์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ˆ˜๋…„์— ๊ฑธ์ณ ๊ด€์‹ฌ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ sam-s4s ์š”์ฆ˜์—๋Š” CMultiDataset<this["thing"]> ๋Œ€์‹  ์“ธ ์ˆ˜์žˆ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์‹ฑ ๋œ ์•ก์„ธ์Šค๋Š” typeof ์™€ ๋‹ฌ๋ฆฌ this (๋‹คํ˜•์„ฑ, ์ง์ˆ˜)์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @weswigham- ๋‚ด๊ฐ€ CMultiDataset<ClassName['thing']> ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„ ๋ฌธ์ œ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๊ทธ๋ž˜๋„ ์ž‘๋™ํ•˜๋Š” this ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์กฐํ•ฉ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ...

@ sam-s4s ์š”์ฆ˜์—๋Š” CMultiDataset<this["thing"]> ๋Œ€์‹  ์“ธ ์ˆ˜์žˆ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์‹ฑ ๋œ ์•ก์„ธ์Šค๋Š” typeof ์™€ ๋‹ฌ๋ฆฌ this (๋‹คํ˜•์„ฑ, ์ง์ˆ˜)์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์‹œ๋„ํ–ˆ์ง€๋งŒ TypeScript 3.4.4์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ @ sam-s4s์˜ ํ•˜๋‚˜๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ( ClassName['thing'] ). "ClassName"๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์‹  this ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๊ฐ€ ์žˆ๋‹ค๋ฉด
```ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ
public groupByTypes = [ 'None', 'Foo', 'Bar'] as const;

public groupBy : typeof groupByTypes [number];
`` What is the proposed workaround? And I cannot make groupByTypes` static

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