簡體   English   中英

“從不”類型上不存在屬性“拆分”

[英]Property 'split' does not exist on type 'never'

我有一個可以更新result變量的函數。 如果result最終不是字符串,我會立即停止該函數。 否則,我將 split() 方法應用於字符串result

該功能永遠不會崩潰。 但是,打字稿聲稱:

“'never' 類型不存在屬性 'split'。

這是代碼片段:

 function foo(){ let result = users[category] as { [key: string]: {} }; ["employees", "tech"].forEach((k) => { if (!result[k]) return; return (result = result[k]); }); if (typeof result !== "string") return null; // do more stuff return result .split("__") .map((word:string) => word.toUpperCase()) .join("") : result; }

如何解決這種類型的問題?

您正在為result變量顯式分配一個null值:

let result = null;

條件:

if (typeof result !== "string") 

始終評估為真。 return result...代碼將永遠不會執行。

如果您稍微修改您的函數以接受result作為參數,您的條件將按您的預期工作,並且 TS 不會抱怨。

function foo(result: string | null) {  // result arg can be possibly null
    // do stuff
}

在您的代碼示例中,結果的類型為null僅為 null

如果您希望使其接受 null 或字符串,則需要明確聲明

function foo(){
let result: string | null = null
// do stuff
if (typeof result !== "string") return null;
// do more stuff
return result
        .split("__")
        .map((word:string) => word.toUpperCase())
        .join("")
    : result;
  }

此外,根據您的 TS 版本,您可以壓縮這些檢查,使其更加簡潔(使用空合並和可選鏈接)

function foo(){
  let result: string | undefined;

  // do stuff to possibly make result a string
  // do more stuff

  return result
        ?.split("__")
        .map((word:string) => word.toUpperCase())
        .join("") ?? null
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM