为什么TypeScript强制我返回无法访问的代码?

erhoui1w  于 2023-02-05  发布在  TypeScript
关注(0)|答案(2)|浏览(147)
    • bounty将在4天后过期**。回答此问题可获得+100的声誉奖励。Guerric P正在寻找此问题的更详细的答案

我有这个代码:

import { Point, LineString } from 'geojson';

export function getIconPoint(geometrie: Point | LineString): Point {
  if (geometrie.type === 'Point') {
    return geometrie;
  }

  if (geometrie.type === 'LineString') {
    return {
      type: 'Point',
      coordinates: geometrie.coordinates[0],
    }
  }

  // unreachable
}

在两个if语句之后,代码应该是不可达的,因为PointLineString是基于type字段区分的接口。TypeScript仍然不高兴,要求我返回一些东西,但我不想添加Point以外的任何东西作为返回值类型:
函数缺少结束return语句,并且返回类型不包括"undefined"
我该怎么用干净的方式解决这个问题?
TypeScriptPlayground

ee7vknir

ee7vknir1#

如果要确保geometrie是枚举选项之一,可以在函数末尾抛出异常。
throw new Error("geometrie is neither Point nor LineString");
错误就会消失。
否则,我会采用OOD设计,在这种设计中,您可以使用dispatch而不是使用if语句检查类型。

6pp0gazn

6pp0gazn2#

在这种情况下,为什么不省略else呢?
如果你只有两个选择...

import { Point, LineString } from 'geojson';

export function getIconPoint(geometrie: Point | LineString): Point {
  if (geometrie.type === 'Point') {
    return geometrie;
  }

  return {
    type: 'Point',
    coordinates: geometrie.coordinates[0],
  }
}

同上,如果你有更多的选择btw,只需省略最后一个条件。
typescript 不应该抱怨,当它写成这样。
显然,为了使它更好,我们可能更喜欢使用排序的exhaustive type-checking函数。

相关问题