web-dev-qa-db-ja.com

フロー:プロパティ...がオブジェクトリテラルにないため、...を取得できません

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がexamplebarまたはobjectWithSomeExampleKeysにないその他のプロパティにすることはできないことをどのように認識しますか?

5
jameslk

私はこの問題の解決策を見つけました:

サンプルコードから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];
  }
}

https://flow.org/try/#0C4TwDgpgBAogHgQwLZgDbQLxQOQDMD2+2UAPjgEYIBOxZ2lAXtgNwBQrAxvgHYDOwUfOQBWEDsADqAS2AALAMr4kEeMjQQA0hBC8AXFADeAbQiIU6favMQAuvv5Up3AOYBfKFgOsoUAvn14hNgANN5QjAGM2KyubKy4AK7c4lI8ULIQVBC8ACoZAApUQuhIABSmahawZuoAlPoAbvhSACaGYVK4UOU16FBOgiJikjIKSiq9mtq8te0+PkKi4tJyispW6lo6JpM2bD6uMUA

1
jameslk

問題は、例が'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];
  }
}
0
TLadd