JavaScriptのexample
演算子を使用してin
変数の型を調整する次のコードがあります。
type Example = 'foo' | 'bar' | 'baz';
const objectWithSomeExampleKeys = {
foo: 'foo',
baz: 'baz'
};
function heresTheProblem(example: Example): void {
if (example in objectWithSomeExampleKeys) {
objectWithSomeExampleKeys[example];
}
}
しかし、代わりに、次のエラーが発生します。
10: objectWithSomeExampleKeys[example];
^ Cannot get `objectWithSomeExampleKeys[example]` because property `bar` is missing in object literal [1].
References:
3: const objectWithSomeExampleKeys = {
^ [1]
Flowがexample
をbar
またはobjectWithSomeExampleKeys
にないその他のプロパティにすることはできないことをどのように認識しますか?
私はこの問題の解決策を見つけました:
サンプルコードからobjectWithSomeExampleKeys
を{[example: Example]: string}
で明示的に入力すると、エラーは発生しなくなります。
type Example = 'foo' | 'bar' | 'baz';
// Explicit type added to objectWithSomeExampleKeys:
const objectWithSomeExampleKeys: {[example: Example]: string} = {
foo: 'foo',
baz: 'baz'
};
function heresTheProblem(example: Example): void {
if (example in objectWithSomeExampleKeys) {
objectWithSomeExampleKeys[example];
}
}
問題は、例が'bar'
であるため、例が'foo' | 'bar' | 'baz'
になる可能性があることです。問題なくアウトこのチェック: https://flow.org/try/#0C4TwDgpgBAogHgQwLZgDbQLxQOQDMD2+2UAPjgEYIBOxZ2lAXtgNwBQrAxvgHYDOwUfOQBWEDsADqAS2AALAMr4kEeMjQQA0hBC8oWAN6soUAvgBcOU9gA0RqIwv0ETW8cpVH77KwC+bVrgArtziUjxQshBUELwAKpEAClRC6EgAFBCIKOgW-FRS3ADmAJQWAG74UgAmUIbGUrhQGVnqUAWCImKSMgpKKi3oWjrFtXbGQqLi0nKKyqrZmtq8ANqZaugAumzGPr5AA
type Example = 'foo' | 'bar' | 'baz';
const objectWithSomeExampleKeys = {
foo: 'foo',
baz: 'baz',
bar: 'bar'
};
function heresTheProblem(example: string): void {
if (example in objectWithSomeExampleKeys) {
objectWithSomeExampleKeys[example];
}
}