Typescript:タイピングの動的キーを設定しようとしています

3
2022.01.14

オブジェクトプロパティから特定の型を解決する型を設定しようとしています。

interface SubjectA {
    id: string
    title: string
    description: string | null
    quantity: number
    links: string[]
}

let subjectA: SubjectA = {
    id: "abc",
    title: "def",
    description: null,
    quantity: 45,
    links: ["ghi", "jkl"],
}

executeProcessor(subjectA, {
    processors: [
        {
            id: "title",
            process: (should_be_infered_as_string) => {},
        },
        {
            id: "description",
            process: (should_be_infered_as_string_or_null) => {},
        },
        {
            id: "quantity",
            process: (should_be_infered_as_number) => {},
        },
        {
            id: "links",
            process: (should_be_infered_as_string_list) => {},
        },
    ],
})

ここでは、 指定されたprocess に一致するプロパティの型として 、idコールバックのパラメータを推論したいと思います。

プロセッサの項目のインターフェイスを作成することは難しいものではありません。

interface PropertyProcessor<T, K extends keyof T> {
    id: K,
    process: (value: T[K]) => void
}

しかし、私は processors 属性自体を入力するのに苦労しています:

interface ItemProcessor<T> {
    processors: PropertyProcessor<T, what_to_put_here_?>[]
}

これまで 、私はkeyof T の代わりとして what_to_put_here_?を使用してきました。しかし、私のパラメータは、可能なオプション(string | null | number | string[])のいずれかとして推測されるようになりました。

私のPropertyProcessor型はジェネリックKを持つべきではないと思うし、processパラメータの型を自分自身に決定する必要があります:

interface PropertyProcessor<T> {
    id: keyof T,
    process: (value: T[same_as_id_type]) => void
}

しかし、私はこれを行う方法を知りません。

あなたが助けてくれてありがとう。

ここの遊び場

回答
2
2022.01.14

これを行う typescript を取得するには、キーの組として推論される型パラメーターを追加し、マップされた型を使用してその組をプロセッサの配列にマッピングします。

type ProcessorMap<T, K extends Array<keyof T>> = {
    [P in keyof K]: PropertyProcessor<T, K[P] & keyof T>
}

function executeProcessor<T,P extends [keyof T] | (keyof T)[]>(item: T, processor: {
    processors: ProcessorMap<T, P>
}) {
}

プレイグラウンドリンク

制約 [keyof T] | (keyof T)[] は 、P をタプルに推論させます。次に、マップされたタイプ の ProcessorMap を使用して、実際に必要な組にマップします。