自分の欲しいものが可能かどうかはよくわかりません。私はしばらく試してみましたが、今はあきらめてコミュニティに助けを求めています。
次のような構成オブジェクトが必要です。
const someConfig: ParameterDescriptions = {
someNumProperty: {
name: 'numPropert',
type: 'number',
defaultValue: 42,
},
someStrProperty: {
name: 'strPropert',
type: 'string',
defaultValue: 'some default value',
},
someBoolProperty: {
name: 'boolProperty',
type: 'boolean',
defaultValue: false,
},
};
そして、次のようなオブジェクト:
interface MyState {
someNumProperty: number;
someStrProperty: string;
someBoolProperty: boolean;
}
とMyState
同じプロパティを持ちますがsomeConfig
、それぞれParameterDesc
のタイププロパティに記載されているタイプを使用して強制したいと思います
このParameterDescriptions
ように見えます:
export interface BaseParameterDesc {
name: string;
}
export interface NumberParameterDesc extends BaseParameterDesc {
type: 'number';
defaultValue?: number;
}
export interface StringParameterDesc extends BaseParameterDesc {
type: 'string';
defaultValue?: string;
}
export interface BooleanParameterDesc extends BaseParameterDesc {
type: 'boolean';
defaultValue?: boolean;
}
export type ParameterDesc =
NumberParameterDesc|StringParameterDesc|BooleanParameterDesc;
export type ParameterDescriptions = {
[key: string]: ParameterDesc;
};
しかし、MyState
とのインスタンスとの関係を作成する方法がわかりませんParameterDescription
。
私が持っていたアイデアの1つは、MyStateにこれを強制しようとするStateタイプを実装させることでしたが、実際には機能しません
type State<PDesc extends ParameterDescriptions> = {
// The .type at the end does not work, but I don't know
// of alternatives
[property in keyof PDesc]: PDesc[property].type;
};
何か案は?それともこれは不可能ですか?
この投稿のすべてのコードは、このTypescriptPlaygroundにあります。
解決する必要のある最初の問題は、定義する方法がsomeConfig
実際にはプロパティ名を保持せず、任意の文字列でインデックス付け可能な変数になることです。ParameterDescriptions
一般的なヘルパー関数を使用すると、実際のキー作成の制約を簡単に適用して保持できます。
function createConfig<T extends ParameterDescriptions>(c: T): T {
return c;
}
const someConfig = createConfig({
someNumProperty: {
name: 'numPropert',
type: 'number',
defaultValue: 42,
},
someStrProperty: {
name: 'strPropert',
type: 'string',
defaultValue: 'some default value',
},
someBoolProperty: {
name: 'boolProperty',
type: 'boolean',
defaultValue: false,
},
});
someConfig
キー名が保持されるようになったので、同様のアプローチを使用できます。type
プロパティをタイプとして直接使用することはできません。タイプ名とタイプの間でマップするために追加のタイプが必要です(条件付きタイプを使用することもできますが、これは簡単に思えますこの場合)
type TypeNamesToTypes = {
boolean: boolean;
string: string;
number: number;
}
type State<T extends ParameterDescriptions> = { [P in keyof T]: TypeNamesToTypes[T[P]['type']]}
type MyState = State<typeof someConfig> // same as = {someNumProperty: number;someStrProperty: string;someBoolProperty: boolean;}
遊び場リンク
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加