Programing

형식:동일한 개체 내의 다른 속성에 종속되는 속성 유형

c10106 2022. 4. 9. 09:56
반응형

형식:동일한 개체 내의 다른 속성에 종속되는 속성 유형

두 가지 속성을 가진 TypeScript 인터페이스가 있음(type:string그리고args:object. The.args에 따라 다른 특성을 가질 수 있다.type. 적용해야 하는 유형 정의args컴파일러/완료자가 어떤 속성이 허용되는지 알 수 있도록args?

이것은 내가 Redex에서 액션을 사용하는 방식과 다소 유사하다.type그리고 apayload내 환원기에서 컴파일러는 페이로드가 무엇을 포함하고 있는지 스위치로 알 수 있다.하지만 내 목적과 함께 이걸 작동시킬 수는 없어.나는 https://artsy.github.io/blog/2018/11/21/conditional-types-in-typescript/에서 훌륭한 기사를 읽었지만, 이것은 서로 의존하는 두 개의 아그로 된 방법의 문제점을 설명하고 있다. 그러나 어떻게 하면 동일한 개체 내의 두 개의 속성에서 이것을 작동시킬 수 있을지는 모른다.

export interface IObject {
  type: ObjectType
  parameters: ObjectParameters
}
export type ObjectType = "check" | "counter"
export interface IParametersCheck {
  checked: boolean
}
export interface IParametersCounter {
  max: number
  min: number
  step: number
}
export type ObjectParameters = IParametersCheck | IParametersCounter

만약 내게도 a가 있다면IObject그리고 컴파일러/완성이 다음에 대한 속성을 제공해야 하는 유형을 "확인"으로 설정하십시오.IParametersCheck.

나는 네가 실제로 찾고 있는 것이 차별받는 결합이라고 생각해. IObject그 자체가 결합이 될 경우:

export type IObject = {
    type: "checked"
    parameters: IParametersCheck
} | {
    type: "counter"
    parameters: IParametersCounter
}
export type ObjectType = IObject['type'] //// in case you need this union
export type ObjectParameters = IObject['parameters']  //// in case you need this union

export interface IParametersCheck {
    checked: boolean
}
export interface IParametersCounter {
    max: number
    min: number
    step: number
}

조건부 유형으로도 할 수 있지만, 나는 조합 솔루션이 더 효과적이라고 생각한다.

export interface IObject<T extends ObjectType> {
    type: T
    parameters: T extends 'checked' ? IParametersCheck: IParametersCounter
}

또는 매핑 인터페이스가 있는 경우

export interface IObject<T extends ObjectType> {
    type: T
    parameters: ParameterMap[T]
}
type ParameterMap ={
    'checked': IParametersCheck
    'counter': IParametersCounter
}

export type ObjectType = keyof ParameterMap

참조URL: https://stackoverflow.com/questions/56949513/typescript-type-of-a-property-dependent-on-another-property-within-the-same-obj

반응형