【发布时间】:2017-05-12 22:26:50
【问题描述】:
想要在访问对象的属性之前创建包含一些对象并执行空/未定义检查的 Maybe 类。 当然,应该输入结果( Maybe 或 Maybe )。
这是一个例子:
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 在这里可以正常工作并输入。例如:
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
但是在定义“apply”函数时有一个问题,它将接受对象属性的名称,这实际上是一个函数,执行该函数并返回 Maybe。
// 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时如何获取方法的返回类型。 -
如果没有检测和确保 'f' 确实是函数名称(以某种方式表达
P extends keyof T, TR, T[P] extends (...args: any[]) => TR)的方法,我不确定这是否可行。
标签: typescript maybe