Типовая цепочка нулей и сужение типов - PullRequest
1 голос
/ 01 апреля 2020

Я сталкивался со случаем, когда я чувствую, что машинопись не правильно сужает данный тип.

(value: number[] | null) => {
  if ((value?.length ?? 0) > 0) value[0];
};

В ветке if это все равно дает мне Object is possibly 'null', хотя условие будет неверно, если value равно null.

Разве это не должно быть сужено и почему да / нет?

Есть ли удобный обходной путь, если это ожидаемое поведение?

1 Ответ

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

Не полный ответ, но:

Это произошло из-за того, что у вас нет прямой проверки на null / undefined и TS еще не настолько умен, чтобы идентифицировать это сам.

У вас есть варианты:

1. Более подробный, но более безопасный:

Используйте проверку как здесь:

(value: number[] | null) => {
    if (value ==null && value.length > 0) value[0];
};

или с печатными надписями как здесь:

(value: number[] | null) => {
    if (!isnull(value) && value.length > 0) value[0];
};

function isnull(value: any): value is null {
    return value == null;
}

2. Вариант для уверенных людей:

Скажите TS, что: Я уверен, просто сделайте это и используйте! нотации. Как здесь:

(value: number[] | null) => {
  if (value?.length ?? 0 > 0) value![0];
};

Надеюсь, это поможет

...