![](/img/trans.png)
[英]TypeScript - typesave mapping types of restricted tuple generic
[英]Generic mapping of types in typescript
讓我們想象一下類型T:
type T = {
prop1: (s: S) => T1,
prop2: (s: S) => T2,
prop3: (s: S) => T3,
}
現在讓我們想象一下W型
type W = (s: S) => {
prop1: T1,
prop2: T2,
prop3: T3,
}
編寫一個可以輕松將T映射到W的函數很容易,
是否有可能在打字稿中寫出通用類型的安全版本?
function x(t: T): W {
return funtion(s: S) {
prop1: t.prop1(s),
prop2: t.prop2(s)
prop3: t.prop3(s)
}
}
缺少哪種功能語言來簡化此操作,例如高階通用類型?
您確實可以在TypeScript中編寫其通用版本:
function x<S, V>(t: {[K in keyof V]: (s: S) => V[K]}): (s: S) => V {
return function(s: S): V {
const ret = {} as V;
Object.keys(t).forEach((k: keyof V) => {
ret[k] = t[k](s);
})
return ret;
}
}
const xSpecific: (t: T) => W = x; // okay
請注意, V
是W
函數的返回類型。 (因此W
本質上與(s: S) => V
。) x
的輸入是與T
對應的映射類型 :它具有與V
相同的鍵,但是其值是從S
到相應屬性的函數。的V
因為TypeScript支持從映射類型進行推論,所以使函數輸入成為映射類型而使輸出成為未映射類型是可以避免的。 否則,您需要類似建議的“ extended typeof
”功能來從T
泛型派生W
(這可能是您所暗示的缺少的語言功能。)
至於實現,我遍歷t
的鍵,並將每個函數t[k]
應用於輸入s
。
xSpecific
與x
縮小為您發布的特定T
和W
類型相同。 之所以編譯,是因為TypeScript識別出通用x
是兼容的。
現在進行警告和精美印刷。 不幸的是,編譯器無法直接從x
可靠地推斷出S
的類型。 如果僅使用T
輸入調用泛型x()
,則會得到以下信息:
declare const t: T;
const w = x(t); // (s: {}) => { prop1: T1; prop2: T2; prop3: T3; }
w
並不完全是W
...,它接受任何輸入,而不僅僅是S
如果您確實需要縮小輸入類型,則必須自己手動指定通用參數來完成:
const w = x<S, {prop1: T1, prop2: T2, prop3: T3}>(t);
這很丑陋,或者通過斷言或注釋手動縮小結果w
:
const w: W = x(t);
無論如何,希望能有所幫助。 祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.