Typescript: 일반 μ •μ˜μ—μ„œ 'ν™•μž₯'을 μ‚¬μš©ν•˜μ—¬ 일반 μœ ν˜• 속성에 ν˜Έν™˜ κ°€λŠ₯ν•œ 값을 ν• λ‹Ή ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 04μ›” 07일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: microsoft/TypeScript

TypeScript 버전 : 2.2.2

μ œλ„€λ¦­μ΄ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ˜€ν•΄ ν•  μˆ˜λ„ μžˆμ§€λ§Œ (κ·Έλ ‡λ‹€λ©΄ μ˜¬λ°”λ₯Έ λ°©ν–₯을 μ•Œλ €μ£Όμ„Έμš”) λ²„κ·Έμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

μ•”ν˜Έ

// A *self-contained* demonstration of the problem follows...

interface BaseState {
    on: boolean;
};

class Component {
    state: BaseState;

    setState(state: BaseState) {
        this.state = state;
    }

    onInput({ value }: { value: number }) {
        this.setState({ on: value > 0 });  // no error
    }
}

class GenericComponent<State extends BaseState> {
    state: State;

    setState(state: State) {
        this.state = state
    }

    onInput({ value }: { value: number }) {
        this.setState({ on: value > 0 });  // error Argument of type '{ on: boolean; }' is not assignable to parameter of type 'State'.
    }
}

μ˜ˆμƒλ˜λŠ” λ™μž‘ :
μœ„ 예제의 Component ν΄λž˜μŠ€μ—μ„œ BaseState μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 μ‚¬μš©ν•  λ•Œ 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. State μ œλ„€λ¦­μ΄ BaseState λͺ…μ‹œ 적으둜 ν™•μž₯ν•˜λ―€λ‘œ GenericComponent ν΄λž˜μŠ€μ—μ„œ λ™μΌν•œ λ™μž‘μ„ κΈ°λŒ€ν•©λ‹ˆλ‹€.

μ‹€μ œ 행동 :
λŒ€μ‹  this.setState({ on: value > 0 }); 와 κ΄€λ ¨λœ λ‹€μŒ 였λ₯˜κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. " '{on : boolean;}'μœ ν˜•μ˜ μΈμˆ˜λŠ” 'State'μœ ν˜•μ˜ 맀개 λ³€μˆ˜μ— ν• λ‹Ή ν•  수 μ—†μŠ΅λ‹ˆλ‹€."

Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 글을 μ“°λ©΄ μ–΄λ–»κ²Œ 될지 κ³ λ €ν•˜μ‹­μ‹œμ˜€

var t = new GenericComponent<{on: boolean, thing: string}>();
t.onInput({ value: 30 });
t.state.thing.substr(0); // 'thing' property should exist, but doesn't

λͺ¨λ“  3 λŒ“κΈ€

이 글을 μ“°λ©΄ μ–΄λ–»κ²Œ 될지 κ³ λ €ν•˜μ‹­μ‹œμ˜€

var t = new GenericComponent<{on: boolean, thing: string}>();
t.onInput({ value: 30 });
t.state.thing.substr(0); // 'thing' property should exist, but doesn't

λ‹€μŒμ€ κ°„λ‹¨ν•œ μ˜ˆμž…λ‹ˆλ‹€.

class Stateful<State extends { on: boolean }> {
  state: State = {
    on: true
  }; // error
}

이것이 μž‘λ™ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” Stateful 이 { on: boolean } 와 μ •ν™•νžˆ λ™μΌν•œ μœ ν˜• 인수둜 μΈμŠ€ν„΄μŠ€ν™” 될 λ•Œλ§Œ μœ νš¨ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

기본적으둜 _ 쑴재 _ μœ ν˜• T , Stateful 의 μœ ν˜• 인수의 μ œμ•½ 쑰건을 μΆ©μ‘±ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ν™”κ°€ μœ νš¨ν•˜μ§€λ§Œ _for all_ types T λ³΄μœ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. T λŠ” Stateful 의 ν˜•μ‹ 인수 μ œμ•½ 쑰건을 μΆ©μ‘±ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μœ„μ˜ 잘λͺ»λœ μ½”λ“œλŠ” λͺ¨λ“  μœ ν˜•μ— λŒ€ν•΄ T<T> μ—¬κΈ°μ„œ T, Stateful`.

λ…Όλ¦¬μ μœΌλ‘œ λ‹€μŒκ³Ό 같이 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μ—­μ„€

  1. P { on: boolean } μœ ν˜•μœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
  2. T λ₯Ό P ν• λ‹Ή ν•  μˆ˜μžˆλŠ” λͺ¨λ“  μœ ν˜• T Stateful<T> μœ„μ˜

λ°˜λŒ€ 사둀에 μ˜ν•œ 반증

  1. U { on: boolean, value: number } μœ ν˜•μœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
  2. U λŠ” μ •μ˜μ— 따라 P ->에 ν• λ‹Ή κ°€λŠ₯ν•©λ‹ˆλ‹€.
  3. Stateful<U> μœ νš¨ν•˜μ§€ μ•ŠμŒ-> λŒ€μ²΄
  4. λ”°λΌμ„œ νƒ€μž…μ—κ²Œ 쑴재 T λ˜λ„λ‘ T 귀속 인 P 및 Stateful<T> 잘λͺ»λœ 싀체화 -> λ„Œμ§€μ‹œ

@RyanCavanaugh @aluanhaddad 촬영, λ‚˜λŠ” 그것을 μ•Œκ³  μžˆμ—ˆλ‹€. λ‚˜λŠ” 문제λ₯Ό 더 λ‹¨μˆœν•œ κ²ƒμœΌλ‘œ μ •λ¦¬ν•˜λ €κ³  λ…Έλ ₯ν•˜λŠ” λ™μ•ˆ ν˜Όλž€μŠ€λŸ¬μ›Œν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μ‹œλ„ν•΄λ³΄μ„Έμš”. 이 경우 λΆ€λΆ„ μ‚¬μš©μ€ μ–΄λ–»μŠ΅λ‹ˆκΉŒ? μ—¬μ „νžˆ λΉ„μŠ·ν•œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

interface BaseState {
    on: boolean;
};

class Component {
    state: BaseState;

    setState(partialState: Partial<BaseState>) {
        this.state = { ...this.state, ...partialState };
    }

    onInput({ value }: { value: number }) {
        this.setState({ on: value > 0 });  // no error
    }
}

class GenericComponent<State extends BaseState> {
    state: State;

    setState(partialState: Partial<State>) {
        this.state = { ...this.state, ...partialState };
    }

    onInput({ value }: { value: number }) {
        this.setState({ on: value > 0 });  // error: Argument of type '{ on: boolean; }' is not assignable to parameter of type 'Partial<State>'
    }
}
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰