想要在訪問對象的屬性之前創建包含某個對象並執行空/未定義檢查的T>類<。 當然,應該輸入結果(可能是< null>或Maybe < TRes>)。使用keyof定義方法的返回類型
下面是一個例子:
class Maybe <T> {
constructor(public value: T) {}
static of <P> (obj: P): Maybe <P> {
return new Maybe(obj);
}
map <TResult> (fn: (arg: T) => TResult): Maybe <TResult> {
return this.isNothing ? nothing : new Maybe(fn(this.value));
}
public get < P extends keyof T > (name: P): Maybe <T[P]> {
return this.isNothing ? nothing : Maybe.of(this.value[name]);
}
get isNothing(): boolean {
return this.value == null;
}
}
let nothing = new Maybe(null);
Everethisng在這裏工作精細化和類型化。對於的exaple:
class Test {
a = {
id: 1,
name: "test1"
};
f = (foo: string) => {
return new Test();
};
};
let t = new Test();
console.log(Maybe.of(t).get('a').get('name').value); // ok
但與定義「應用」功能的問題,將接受對象的屬性的名稱,實際上是一個函數,執行該功能,並返回也許< TResult>。
// T[fName]: (...args)=> TResult
public apply < P extends keyof T > (fnName: P, ...args: any[]) /*: Maybe<Tresult> */ {
if (!this.isNothing) {
let res = null;
let fn = this.value[fnName];
if (isF(fn)) {
return Maybe.of(fn(...args));
}
}
return nothing;
}
無法找到定義「應用」調用結果的解決方案。
let fResult = Maybe.of(t).apply('f', 'foo');
// fResult is Maybe<any> , expected to be Maybe<Test>
是否有人知道如何定義「應用」結果的類型?甚至在TS 2.3中這可能嗎?
這裏有相同的代碼在操場上的鏈接: TS playground
感謝
我不清楚你的問題是什麼。在你的遊樂場代碼中,你忘記了聲明類型參數'Tresult'。沒關係,我誤解了,我看到了這個問題。 –
我認爲這個問題可以縮小一點,但並不是很清楚你想要什麼。看起來你只是問在使用'keyof'時如何得到一個方法的返回類型。 – Rob
我不確定這是不可能的,沒有一種檢測方式,並確保'f'確實是一個函數的名稱(以某種方式表達'P延伸keyof T,TR,T [P]擴展(... args:任何[])=> TR')。 – y2bd