[英]How to define a function's argument type dependent on string argument in Typescript?
[英]Getting the type for an key to define function argument
我有一個類似下面例子的類型
export type Signals = {
activity: boolean;
quest: string;
creator: number;
}
使用這種類型,我將獲得一個具有以下屬性的函數
export function initStation<T>(){
return {
signal: (id: keyof T, value: T[keyof T]){
// code
}
}
}
但是當我使用這個實現時,我總是有一個聯合類型 vor 值參數。 即使將 id 參數設置為活動、任務或創建者。
我試圖獲得更好的支持,例如當 id 等於活動時,可能的類型只是一個布爾值,因為在我上面的類型中活動被定義為布爾值。
我希望像這樣調用我的函數
const station = initStation<Signals>()
station.signal('activity', true); // fine
station.signal('quest', 'any quest'); // fine
station.signal('creator', 1234); // fine
當我嘗試使用如下函數時出現錯誤
station.signal('activity', 'abc'); // error
station.signal('quest', 123); // error
station.signal('creator', true); // error
如果id
是keyof T
類型並且value
是T[keyof T]
類型,那么它們都是不相關的聯合類型,並且沒有什么可以阻止某人傳入一個id
和一個對應於T
不同屬性的value
。 解決這個問題的一種方法是讓你的方法在id
類型中通用, K extends keyof T
,然后用它來表示value
:
export function initStation<T>() {
return {
signal: <K extends keyof T>(id: K, value: T[K]){
// code
}
}
}
這給了你你想要的行為:
const station = initStation<Signals>();
station.signal('activity', true); // fine
station.signal('quest', 'any quest'); // fine
station.signal('creator', 1234); // fine
station.signal('activity', 'abc'); // error
station.signal('quest', 123); // error
station.signal('creator', true); // error
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.