gpt4 book ai didi

typescript - 区分 Typescript 中的私有(private)成员联合体

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:21 26 4
gpt4 key购买 nike

我在区分私有(private)类(class)成员的类型时遇到了一点问题。我正在尝试使用字符串文字访问变量 v1v2,但是 typescript 返回一个类型联合。我设法通过给 typescript 一点“插入”来解决这个问题。坏消息是它只适用于公共(public)成员。请参阅下面的示例:

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

有人知道某种解决方法吗?

编辑:澄清一下,我正在寻找一个懒惰/通用的解决方案。还有其他方法可以实现我想要的,但是它们都需要我维护它们以防变量类型发生变化(例如,显式重载)。

最佳答案

Bleggh,这似乎是一个 design limitation TypeScript,在某些情况下您不能使用索引访问和私有(private)属性。不确定如何最好地进行导航。

这里有一些“有用”的东西,但我不推荐实际去做:

//@ts-ignore
type UnsafeIndexed<T, K extends string> = T[K]

上面是一个故意错误的类型别名,它要求编译器进行索引访问,即使它不能确定这样的事情是否有效。看看它:

type Foo = { bar: string, baz: number };
type FooBar = UnsafeIndexed<Foo, "bar">; // string
type FooBaz = UnsafeIndexed<Foo, "baz">; // number
type FooBad = UnsafeIndexed<Foo, "nope">; // any

现在你可以这样做了:

class Test {
private v1: string;
private v2: number;

get<K extends 'v1' | 'v2'>(what: K): UnsafeIndexed<this,K> {
return (this as any)[what];
}
}

请注意,您必须执行 (this as any),因为 this[what] 仍然会引发编译器错误。测试一下:

let myTest = new Test();
const v1 = myTest.get('v1'); // string
const v2 = myTest.get('v2'); // number

好的,就像我说的那样“有效”。但我不想要那个感人的生产代码。我不知道是否有一个不那么邪恶的通用解决方法。就个人而言,我要么只使用公共(public)属性,要么使用重载。您的里程可能会有所不同。

希望对您有所帮助。祝你好运!

关于typescript - 区分 Typescript 中的私有(private)成员联合体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48553456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com