【发布时间】:2018-07-11 05:30:33
【问题描述】:
我在区分私人班级成员的类型方面遇到了一点问题。我正在尝试使用字符串文字访问变量v1 和v2,但是打字稿返回一个类型联合。我设法通过给打字稿一点“推动”来解决这个问题。坏消息是它只适用于公众成员。请参阅下面的示例:
class Test {
private v1: string;
private v2: number;
v3: string;
v4: number;
private v5: string;
private v6: number;
// Works for all members, but does not discriminate union
get12(what: 'v1' | 'v2') {
return this[what];
}
// Works only for public members
get34<T extends 'v3' | 'v4'>(what: T) {
return this[what];
}
// Explicit overload works, but it defeats the purpose of being lazy
get56(what: 'v5'): string;
get56(what: 'v6'): number;
get56(what: 'v5' | 'v6') {
return this[what];
}
}
let myTest = new Test();
myTest.get12('v1'); // returns "string | number" type
myTest.get34('v3'); // returns "string" type
myTest.get56('v5'); // returns "string" type
有人知道某种解决方法吗?
编辑: 为了澄清,我正在寻找一个惰性/通用的解决方案。还有其他方法可以实现我想要的,但是它们都需要我维护它们以防变量类型发生变化(例如,显式重载)。
【问题讨论】:
-
显式重载有用吗?
-
你检查过类型保护吗? basarat.gitbooks.io/typescript/docs/types/…那么你至少可以在事后缩小类型
-
@vincecampanale 在这种情况下我真的不需要类型保护。显式重载会起作用,但是我希望有人知道某种方法来欺骗打字稿以区分联合,就像我为公共成员所做的那样。
标签: typescript