簡體   English   中英

Typescript根據if語句自動判斷出什么類型

[英]Typescript automatically figure what is the type base on the if statement

假設我有一個帶有以下簽名的函數。

function doSomething(bool = false): number | string {
    if (bool) {
        return '1';
    } else {
        return 1;
   }
}

const value = doSomething();

const valueTwo = doSomething(true);

我的問題是value變量的typenumber | string 在兩種情況下都是number | string 我怎樣才能告訴打字稿在if塊的基礎上返回正確的類型,而不要做類似的事情:

const value = doSomething() as number;

const valueTwo = doSomething(true) as string;

一個函數可以具有多個簽名,並且如果返回類型取決於原始值,則可以使用文字類型來進行區分。 您可以寫:

// Public sigantures 
function doSomething(bool?: false): number // With false constant
function doSomething(bool: true): string // With true constant or missing
function doSomething(bool?: boolean): number | string // With unknown bool value 
// Implementation siganture
function doSomething(bool: boolean = false): number | string {
    if (bool) {
        return '1';
    } else {
        return 1;
    }
}
var s = doSomething(true) // s is string
var n2 = doSomething() // n2 is number
var n3 = doSomething(false) // n3 is number
declare var b: boolean;
var ns4 = doSomething(b) // ns4 is string | number because it can't be determined at compile time

TypeScript是一種靜態類型的語言-在編譯時,它可以理解代碼中的類型定義,並可以通過檢查您是否沒有交叉類型來幫助查找錯誤。

當您將方法標記為具有返回number | string number | string ,您將向編譯器提供信息: 您知道該方法將返回這兩種可能的類型之一 編譯器無法詳細查看該方法,以了解您的代碼將返回特定類型的條件。 這就是為什么我們必須告訴編譯器方法簽名中所有可能的返回類型的原因。 它無法自己解決。

如果希望編譯器知道類型,則可以使用重載簽名為它提供更多信息,該重載簽名根據一些常量值來區分返回類型:

function doSomething(bool: false): number
function doSomething(bool?: true): string
function doSomething(bool?: boolean): number | string 

編譯器現在可以基於布爾值來解析返回類型,但是只有在該值是常量時才可以這樣做 :在編譯時是已知的。

這意味着這些語句具有已知的單返回類型:

var str = doSomething(true);
var bool = doSomething(false);

但是此調用不會:

declare var input: boolean;
var strOrBool = doSomething(input)

不是直接的答案,而是:

  • 如果您指的是手動輸入文字的時間, 那可能是一個糟糕的設計。 您正在嘗試使函數執行過多操作 在這種情況下,只需將其分為具有不同返回類型的兩個函數即可。 兩者都可以依靠封裝兩者之間共同行為的第三個功能。 不過,在這種情況下要回答這個問題,我不知道有什么辦法可以做到這一點。 要讓編譯器進行復雜的推斷。

  • 如果您希望它能夠找出傳入的任意數據的類型,那將是不可能的。 如果在運行時為它提供用戶提供的數據,則它不可能在編譯時推斷類型。 您要它根據沒有的信息做出決策。

暫無
暫無

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

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