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'μ νμ λ§€κ° λ³μμ ν λΉ ν μ μμ΅λλ€."
μ΄ κΈμ μ°λ©΄ μ΄λ»κ² λ μ§ κ³ λ €νμμμ€
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
λ Όλ¦¬μ μΌλ‘ λ€μκ³Ό κ°μ΄ λ³Ό μ μμ΅λλ€.
μμ€
P
{ on: boolean }
μ νμΌλ‘ μ§μ ν©λλ€.T
λ₯Ό P
ν λΉ ν μμλ λͺ¨λ μ ν T
Stateful<T>
μμ λ°λ μ¬λ‘μ μν λ°μ¦
U
{ on: boolean, value: number }
μ νμΌλ‘ μ§μ ν©λλ€.U
λ μ μμ λ°λΌ P
->μ ν λΉ κ°λ₯ν©λλ€.Stateful<U>
μ ν¨νμ§ μμ-> λ체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>'
}
}
κ°μ₯ μ μ©ν λκΈ
μ΄ κΈμ μ°λ©΄ μ΄λ»κ² λ μ§ κ³ λ €νμμμ€