Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Typescript是否忽略部分数据的getters setters readOnly?_Javascript_Typescript_Api Design_Entity Component System - Fatal编程技术网

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;
} */