Vue ошибка машинописи при фильтрации и отображении списка - PullRequest
0 голосов
/ 30 апреля 2020

Интересно, что мне нужно сделать, чтобы убрать следующую ошибку из моего кода:

У меня есть эти интерфейсы:

export interface ClassifierTO {

   id?: number;
   classifierName?: string;
   userId?: number;
   intents?: Array<IntentTO>;
}

и:

export interface IntentTO {
   id?: number;
   intentName?: string;
   classifierId?: number;
   numberOfSamples?: number;
}

Они были автоматически сгенерированы с помощью openapi-generator.

Когда я использовал это внутри метода class-component из vue:

 let intents = this.classifier.intents
        .filter(intent => intent.intentName === "test")
        .map(intent => intent.numberOfSamples);

Затем результат внутри консоли vs код:

Object is possibly 'undefined'

Что мне нужно изменить, чтобы это больше не воспринималось как ошибка? Версия машинописного текста - 3.8.3, а это tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Это потому, что в вашем ClassifierTO интерфейсе все свойства / ключи являются необязательными. intents?: Array<IntentTO>; сообщает TypeScript, что this.classifier.intents может возвращать неопределенное значение.

Вы можете использовать оператор объединения нулей, чтобы гарантировать постоянное возвращение массива:

let intents = (classifier.intents ?? [])
    .filter(intent => intent.intentName === "test")
    .map(intent => intent.numberOfSamples);

В качестве альтернативы, просто обновите свой интерфейс так, чтобы intents не был необязательным ключом.

1 голос
/ 30 апреля 2020

Знак вопроса в вашем определении говорит машинописи, что это необязательно и может быть пустым.

export interface ClassifierTO {

   id?: number;
   classifierName?: string;
   userId?: number;
   intents?: Array<IntentTO>;
}

Вы можете либо удалить вопросительный знак, либо просто проверить, установлены ли намерения.

...