iT邦幫忙

0

[已經解決] ts 應該報錯但沒報錯

ts

下方程式碼應該報錯,因為不會符合 function reverse(x: number): number; 的規則,請問各位大大為何編譯不會報錯。(無 tsconfig.json,tsc 版本 4.4.3)

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
    return x + '1';
}

已在 Stackoverflow 得到合理的解釋。
Why does function overloading not prompt an error?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
海綿寶寶
iT邦大神 1 級 ‧ 2021-11-05 08:44:15

測試起來像是「同名函式,後面的宣告定義覆蓋掉前面的定義」
即是「以後面的宣告為準」
https://ithelp.ithome.com.tw/upload/images/20211105/200017876RCjNC4b01.png
https://ithelp.ithome.com.tw/upload/images/20211105/20001787Sis4vpz0jS.png
https://ithelp.ithome.com.tw/upload/images/20211105/20001787X2gTMtNZv3.png

回到問題本身
依據這篇的說法
ts 提供function overloading
條件是「參數數量相同」(本題目符合參數數量相同-->只有一個)

為了驗證我定義了不同參數數量的同名函式以報錯
結果
結果還是可以 run
/images/emoticon/emoticon16.gif
https://ithelp.ithome.com.tw/upload/images/20211105/20001787rDa3HhKGer.png

看更多先前的回應...收起先前的回應...
wrxue iT邦好手 1 級 ‧ 2021-11-05 09:11:03 檢舉

崩潰,不知道卡在哪個觀念 /images/emoticon/emoticon46.gif

白話點說

function overloading -> 同名函式是合法的(只要是相同「數量」的參數)

你寫的三個函式都是一個參數
所以不會報錯

講完收工

wrxue iT邦好手 1 級 ‧ 2021-11-05 09:18:54 檢舉

但我的用意是想要限定該函數,若
輸入number,輸出則為number
輸入string,輸出則為string
請 ts 幫我判斷這兩個規則。
但顯然 ts 沒有抓出這個函式輸入 number 會回傳 string
https://ithelp.ithome.com.tw/upload/images/20211105/20117357gleS0dplAV.png

wrxue iT邦好手 1 級 ‧ 2021-11-05 14:51:22 檢舉

感謝大大花時間幫忙嘗試,已於本文中更新在 Stackoverflow 得到能說服我的解答。

2
bsexp301479
iT邦新手 3 級 ‧ 2021-11-05 12:09:59
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
    return x + '1';
}

這種寫法只是先定義出x的資料型別是string還是number
但TypeScript跟JavaScript蠻相似的如果字串+數字的話會自動傳回字串
數字+數字就會傳回數字
如果要特別依照x的資料型別回傳字串或數字時
就需要加入以下

if (typeof x === 'number') {
        return x + 1;
    } else if (typeof x === 'string') {
        return x + "1" ;
    }

希望有幫助到你

看更多先前的回應...收起先前的回應...
wrxue iT邦好手 1 級 ‧ 2021-11-05 12:30:37 檢舉

感謝您的回答,但似乎沒有回答道我的問題「為何編譯不會報錯」。
原程式碼不論輸入是 number 或 string,輸出都為 string,這個行為應該被報錯

js和ts在做資料運算的時候會自動做型別的轉換
你可以試試看

console.log('1'-1)
console.log('1'+1)
console.log(true-1)
console.log(true+1)

並不會因為不同資料型別的運算而報錯
你如果修改成

return x+1

則x傳入'1'輸出'11'
x傳入1輸出2

return x+'1'

而這樣就會預設傳出型別都是string
不管x傳入'1'或1都會輸出'11'

wrxue iT邦好手 1 級 ‧ 2021-11-05 13:35:11 檢舉

傳入1會輸出'11'

這不應該被 ts 檢查出來嗎?
畢竟我沒有定義可以輸入 number 輸出 string 的過載

剛剛研究了一下

function reverse(x: number | string): number | string {
    return x + '1';
}

這個聯合型別以我的理解是當x傳入number或string時
可回傳的值為number或string
你可以試試

function reverse(x: number | string): number {
    return x + '1';
}

這樣不管傳入x傳入number或string時
就都只能回傳number
那就表示

function reverse(x: string): string;

是不可用的多載函式因為最後的實現函式不支持string的型別回傳

wrxue iT邦好手 1 級 ‧ 2021-11-05 14:51:12 檢舉

感謝大大花時間幫忙嘗試,已於本文中更新在 Stackoverflow 得到能說服我的解答。

我要發表回答

立即登入回答