2

我是 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
    };

我以前从未见过这种构造,但我猜这是联合或交集类型(?)。

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

4

1 回答 1

2

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

于 2021-02-18T17:55:11.203 回答