Javascript Typescript是否忽略部分数据的getters setters readOnly?
如何在Javascript Typescript是否忽略部分数据的getters setters readOnly?,javascript,typescript,api-design,entity-component-system,Javascript,Typescript,Api Design,Entity Component System,如何在Partial数据中省略getter、setter、methods 或者存在一种通过typescript获得这种架构的方法 我需要一个具有完全访问权限的类型和一个不具有只读权限的类型 我试着在这里举一个小例子,请参见注释:// export const$A=(()=>{ 甲级{ _uid?:字符串='generateUID()'; _标题?:字符串=“”; 儿童?:A[]=[]; B?:InstanceType=$B.create(); 获取标题(){ 返回此。_title | | thi
Partial
数据中省略getter、setter、methods
或者存在一种通过typescript获得这种架构的方法
我需要一个具有完全访问权限的类型和一个不具有只读权限的类型
我试着在这里举一个小例子,请参见注释://
export const$A=(()=>{
甲级{
_uid?:字符串='generateUID()';
_标题?:字符串=“”;
儿童?:A[]=[];
B?:InstanceType=$B.create();
获取标题(){
返回此。_title | | this。_uid;
}
构造函数(数据:部分
我尝试了很多场景,但都没有成功,总是在某处碰壁!如果你有其他人的方法来构建这个?
据我所知,您无法在类型系统中检测到getter或setter;有关更多信息,请参阅。就是在那里
接口不区分常规属性和访问器属性——它是由接口的实现者决定的实现细节
如果要检测其值为函数类型的属性,可以使用以下答案中的KeysMatching
:
然后,您可以将这些组合起来生成“部分”A
:
type MyPartialA = Omit<A, MethodKeysOfA | ReadonlyKeysOfA>
/* type MyPartialA = {
_uid?: string | undefined;
_title?: string | undefined;
children?: A[] | undefined;
B?: B | undefined;
} */
您还可能希望将MyPartialA
视为A
中的一组可选属性。也就是说,不排除方法和只读属性,而是包含A
中可能不存在的内容。如果是这样,您可以使用回答中的OptionalKeys
键入:
请删除不需要的代码,并使代码与您想要完成的任务最相关。从标题来看,问题似乎很普遍,但与提供的代码不太相关。可能的话,请创建一个易于阅读的示例。是的,删除所有不必要的代码,所有道具在此上下文中都是必要的。删除一个会允许作弊我正在寻找一个在ts中省略getter、setter和methods的解决方案,并保留我的ECS架构。非常感谢您提供了许多其他解决方案,我会看看是否有一个解决方案能让我高兴或帮助我。我希望ts能提供一些更干净、更自然的解决方案,比如PartialProposly
,但它会很好:)
type IfEquals<X, Y, A = X, B = never> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? A : B;
type ReadonlyKeys<T> = {
[P in keyof T]-?: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, never, P>
type ReadonlyKeysOfA = ReadonlyKeys<A>
// type ReadonlyKeysOfA = "Title"
type MyPartialA = Omit<A, MethodKeysOfA | ReadonlyKeysOfA>
/* type MyPartialA = {
_uid?: string | undefined;
_title?: string | undefined;
children?: A[] | undefined;
B?: B | undefined;
} */
$A.create({ Title: '' }); // error!
$A.create({ getFullTitle: () => '' }); // error!
$A.create({
_title: '',
_uid: '',
B: $B.create(),
children: [$A.create({ _title: '', _uid: '' }), $A.create({ _title: '', _uid: '' })],
}); // okay
type OptionalKeys<T> = { [K in keyof T]-?:
({} extends { [P in K]: T[K] } ? K : never)
}[keyof T];
type OptionalKeysOfA = OptionalKeys<A>;
// type OptionalKeysOfA = "_uid" | "_title" | "children" | "B"
type MyPartialA = Pick<A, OptionalKeysOfA>;
/* type MyPartialA = {
_uid?: string | undefined;
_title?: string | undefined;
children?: A[] | undefined;
B?: B | undefined;
} */