טייפסקריפט - משתנה חייב להכיל ערך אם משתנה אחר הוא null


function makeUpdateParams(code: string | null, list: Array<{ version: number[] }>): [Error | null, number[] | null] {
  if (!code) return [new Error('code is empty'), null]
  return [null, list.flatMap(i => i.version)];
}

function updateVersion(versions: number[]) { }

function main() {
  const list = [{ version: [1, 2] }, { version: [3, 4] }];
  const searchParams = new URLSearchParams(window.location.search);
  const [err, params] = makeUpdateParams(searchParams.get('code'), list);
  if (err) return console.error(err);
  updateVersion(params); // TSC throws error here.
}

קיבלתי שגיאה:

Argument of type 'number[] | null' is not assignable to parameter of type 'number[]'.
  Type 'null' is not assignable to type 'number[]'.(2345)

אם ה-err שמוחזר מ-makeUpdateParams הוא null, אז ל-params חייבת להיות ערך. אך נראה ש-TSC לא יודע את זה. מה אני מפספס? במקרה זה, האם אני צריך להשתמש בהמרת סוג כמו params as number[] או מגן סוג מוגדר על ידי המשתמש או מפעיל אישור שאינו null params! שוב?

מגרש המשחקים של TypeScript

עדכון

גרסת TS: 4.5.5

תשובה #1

שנה את סוג ההחזרה של הפונקציה שלך ל-[Error, null] | [null, number[]]:

function makeUpdateParams(code: string | null, list: Array<{ version: number[] }>): [Error, null] | [null, number[]] {
  if (!code) return [new Error('code is empty'), null]
  return [null, list.flatMap(i => i.version)];
}

function updateVersion(versions: number[]) { }

function main() {
  const list = [{ version: [1, 2] }, { version: [3, 4] }];
  const searchParams = new URLSearchParams(window.location.search);
  const [err, params] = makeUpdateParams(searchParams.get('code'), list);
  if (err) return console.error(err);
  updateVersion(params);
}

קישור למגרש משחקים