typescript - Bir değişkenin değeri olmalı eğer başka bir değişken null ise
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.
}
Hata alındı:
Argument of type 'number[] | null' is not assignable to parameter of type 'number[]'.
Type 'null' is not assignable to type 'number[]'.(2345)
Eğer makeUpdateParams’den dönen err null ise, o zaman params mutlaka bir değere sahip olmalıdır. Ama görünüşe göre TSC bunu bilmiyor. Neyi kaçırıyorum? Bu durumda, tekrar params as number[] gibi bir tip dönüşümü mü kullanmam gerekiyor, yoksa kullanıcı tanımlı bir tip koruyucu veya non-null assertion operatörü params! mı kullanmalıyım?
TypeScript Oyun Alanı
GÜNCELLEME
TS sürümü: 4.5.5
Cevap #1
Fonksiyonunuzun dönüş tipini [Error, null] | [null, number[]] olarak değiştirin:
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);
}
Oyun alanı linki
