網站搜尋

TypeScript 縮小泛型函數


假設我們有一個通用函數

function hi<T>(name: T) { }
hi('Alex')
hi('Jim')

我想創建一個新的函數來限制通用型別,並且只允許 Alex 作為 name。類似下面的偽代碼

function hiAlex = hi<'Alex'>
hiAlex('Alex') // works well
hiAlex('Jim')  // ERROR wrong name type

答案#1

遺憾的是,沒有專門的語法。我們能做的最好方式是重複呼叫時所實例化的簽名:

function hi<T>(name: T) { }
const hiAlex: (name: "Alex") => void = hi;

hiAlex('Alex') // works well
hiAlex('Jim')  // ERROR wrong name type

答案#2

function hi<T>(name: T extends string ? 'Alex' : T) { }
hi('Alex')
hi('Jim') // Argument of type '"Jim"' is not assignable to parameter of type '"Alex"'

如果我正確理解你的問題的話,這樣的東西應該可以行得通。

或者乾脆不要讓它變得通用:

function hi(name: 'Alex') { }

或

function hi<T>(name: 'Alex') { }