尝试访问 AVPlaybackStatus 的错误 属性

Error trying to access the error property of AVPlaybackStatus

我是 TypeScript 的新手,正在尝试使用 expo-av 进行音频播放。

下面的代码给我一个错误:TS2339: Property 'error' does not exist on type 'AVPlaybackStatus'.

const { sound, status } = await Audio.Sound.createAsync(track.mp3);
if (status.isLoaded) {
  console.info(status.durationMillis);
}
else {
  console.error("track not loaded", status.error);
}

我查看了status的定义,发现:

export type AVPlaybackStatus =
  | {
      isLoaded: false;
      androidImplementation?: string;
      error?: string; // populated exactly once when an error forces the object to unload
    }
  | {
      isLoaded: true;
      androidImplementation?: string;

      uri: string;

      progressUpdateIntervalMillis: number;
      durationMillis?: number;
      positionMillis: number;
      playableDurationMillis?: number;
      seekMillisToleranceBefore?: number;
      seekMillisToleranceAfter?: number;

      shouldPlay: boolean;
      isPlaying: boolean;
      isBuffering: boolean;

      rate: number;
      shouldCorrectPitch: boolean;
      volume: number;
      isMuted: boolean;
      isLooping: boolean;

      didJustFinish: boolean; // true exactly once when the track plays to finish
    };

我以前从未见过这种构造,但我猜这是一个 union or intersection type (?)。

如何访问 status.error?使用此类类型的典型习语/结构是什么?

模式是鉴别联合 (docs),其中 TypeScript 可以根据一个字段准确地确定类型,该字段对于每个备选方案都是不同的。在本例中,它是 isLoaded 布尔字段,但要使其正常工作,您需要启用 strictNullChecks。除此之外,你处理它的方式完全没问题。