限制是以某种方式约束或限制代码的任何东西。
我正在定义一个简单的本体论,根据三明治的成分对三明治进行分类。结构如下: 课程: 成分 简介 蔬菜 鱼 肉 三明治 生物汉堡 鱼汉堡 数据道具...
在 Typescript 中,如何在编译时将泛型类型限制为多个类之一?例如,如何实现这个伪代码? 可变类型类 在 Typescript 中,如何在编译时将泛型类型限制为多个类之一?例如,你如何实现这个伪代码? class VariablyTyped<T has one of types A or B or C> { method(hasOneType: T) { if T has type A: do something assuming type A if T has type B: do something assuming type B if T has type C: do something assuming type C } } 此外,我希望能够将属性(或任何变量)分配给泛型类型选项之一的特定后代类型,而不是仅分配给给定类型之一。例如: class VariablyTyped<T has one of types A or B or C> { descendentClassOfT: T method(hasOneType: T) { descendentClassOfT = hasOneType } } class D extends class C { methodUniqueToD() { } } const v = new VariablyTyped(new D()) v.descendentClassOfT.methodUniqueToD() 这个答案显然并不明显,因为我花了几个小时。在我看来,这个问题的某种形式已经被问过,但给出的解决方案甚至不适合我编译。前面的问题可能只在非常具体的情况下得到回答,因为赞成票的数量表明它正在解决某些人的问题。 我发布这个新问题是为了清楚地说明一般问题并跟进解决方案。 我为此花了几个小时的时间,但回想起来,解决方案似乎很明显。首先,我提出解决方案,然后将其与以前的方法进行比较。 (在 Typescript 2.6.2 中测试。) // WORKING SOLUTION: union of types with type checks class MustBeThis { method1() { } } class OrThis { method2() { } } abstract class OrOfThisBaseType { method3a() { } } class ExtendsBaseType extends OrOfThisBaseType { method3b() { } } class GoodVariablyTyped<T extends MustBeThis | OrThis | OrOfThisBaseType> { extendsBaseType: T; constructor(hasOneType: T) { if (hasOneType instanceof MustBeThis) { hasOneType.method1(); } else if (hasOneType instanceof OrThis) { hasOneType.method2(); } // either type-check here (as implemented) or typecast (commented out) else if (hasOneType instanceof OrOfThisBaseType) { hasOneType.method3a(); // (<OrOfThisBaseType>hasOneType).method3a(); this.extendsBaseType = hasOneType; } } } 该解决方案的以下检查编译得很好: const g1 = new GoodVariablyTyped(new MustBeThis()); const g1t = new GoodVariablyTyped<MustBeThis>(new MustBeThis()); const g1e: MustBeThis = g1.extendsBaseType; const g1te: MustBeThis = g1t.extendsBaseType; const g2 = new GoodVariablyTyped(new OrThis()); const g2t = new GoodVariablyTyped<OrThis>(new OrThis()); const g2e: OrThis = g2.extendsBaseType; const g2te: OrThis = g2t.extendsBaseType; const g3 = new GoodVariablyTyped(new ExtendsBaseType()); const g3t = new GoodVariablyTyped<ExtendsBaseType>(new ExtendsBaseType()); const g3e: ExtendsBaseType = g3.extendsBaseType; const g3te: ExtendsBaseType = g3t.extendsBaseType; 将上述方法与之前接受的答案进行比较,该答案将泛型声明为类选项的交集: // NON-WORKING SOLUTION A: intersection of types class BadVariablyTyped_A<T extends MustBeThis & OrThis & OrOfThisBaseType> { extendsBaseType: T; constructor(hasOneType: T) { if (hasOneType instanceof MustBeThis) { (<MustBeThis>hasOneType).method1(); } // ERROR: The left-hand side of an 'instanceof' expression must be of type // 'any', an object type or a type parameter. (parameter) hasOneType: never else if (hasOneType instanceof OrThis) { (<OrThis>hasOneType).method2(); } else { (<OrOfThisBaseType>hasOneType).method3a(); this.extendsBaseType = hasOneType; } } } // ERROR: Property 'method2' is missing in type 'MustBeThis'. const b1_A = new BadVariablyTyped_A(new MustBeThis()); // ERROR: Property 'method2' is missing in type 'MustBeThis'. const b1t_A = new BadVariablyTyped_A<MustBeThis>(new MustBeThis()); // ERROR: Property 'method1' is missing in type 'OrThis'. const b2_A = new BadVariablyTyped_A(new OrThis()); // ERROR: Property 'method1' is missing in type 'OrThis'. const b2t_A = new BadVariablyTyped_A<OrThis>(new OrThis()); // ERROR: Property 'method1' is missing in type 'ExtendsBaseType'. const b3_A = new BadVariablyTyped_A(new ExtendsBaseType()); // ERROR: Property 'method1' is missing in type 'ExtendsBaseType'. const b3t_A = new BadVariablyTyped_A<ExtendsBaseType>(new ExtendsBaseType()); 还将上述工作方法与另一个建议的解决方案进行比较,其中泛型类型被限制为扩展实现所有类接口选项的接口。这里发生的错误表明它在逻辑上与之前的非工作解决方案相同。 // NON-WORKING SOLUTION B: multiply-extended interface interface VariableType extends MustBeThis, OrThis, OrOfThisBaseType { } class BadVariablyTyped_B<T extends VariableType> { extendsBaseType: T; constructor(hasOneType: T) { if (hasOneType instanceof MustBeThis) { (<MustBeThis>hasOneType).method1(); } // ERROR: The left-hand side of an 'instanceof' expression must be of type // 'any', an object type or a type parameter. (parameter) hasOneType: never else if (hasOneType instanceof OrThis) { (<OrThis>hasOneType).method2(); } else { (<OrOfThisBaseType>hasOneType).method3a(); this.extendsBaseType = hasOneType; } } } // ERROR: Property 'method2' is missing in type 'MustBeThis'. const b1_B = new BadVariablyTyped_B(new MustBeThis()); // ERROR: Property 'method2' is missing in type 'MustBeThis'. const b1t_B = new BadVariablyTyped_B<MustBeThis>(new MustBeThis()); // ERROR: Property 'method1' is missing in type 'OrThis'. const b2_B = new BadVariablyTyped_B(new OrThis()); // ERROR: Property 'method1' is missing in type 'OrThis'. const b2t_B = new BadVariablyTyped_B<OrThis>(new OrThis()); // ERROR: Property 'method1' is missing in type 'ExtendsBaseType'. const b3_B = new BadVariablyTyped_B(new ExtendsBaseType()); // ERROR: Property 'method1' is missing in type 'ExtendsBaseType'. const bt_B = new BadVariablyTyped_B<ExtendsBaseType>(new ExtendsBaseType()); 具有讽刺意味的是,我后来解决了我的应用程序特定问题,而不必约束通用类型。也许其他人应该吸取我的教训,首先尝试寻找另一种更好的方法来完成这项工作。 我想保护我的泛型,我这样做了: 类型.d.ts type ObjectOptions = BaseObject | ObjectA | ObjectB; interface BaseObject { id: number; } interface ObjectA extends BaseObject { fieldA: string; } interface ObjectB extends BaseObject { fieldB: string; } interface ContainingObject<T extends ObjectOptions> { id: number; info: string; objects: T; } 用法.ts getAllObjects(): ContainerObject<ObjectOptions> { return getAllObjectsData(); } getAObjects(): ContainerObject<ObjectA> { return getAObjectsData(); }
complexContent xsd:restriction 中未提及的元素属性是否从父类型复制过来?
如果 xsd:restriction 中的元素没有由派生该限制的复杂类型的匹配元素使用的属性,则该属性的计算值是多少
您能以某种方式用您自己的应用程序限制任何已安装的应用程序吗?
基本上我想创建一个应用程序,您可以在其中选择任何已安装的应用程序,然后限制/取消限制它们。我对应用程序有一个好主意,但需要用户能够限制安装...
如何处理因身份验证问题导致Google Play开发者账号受限?
开发者您好, 我的 Google Play 开发者帐户因身份验证问题而受到限制。以下是情况摘要: 我收到了来自
如何使用其余 API 创建带有到期日期的 woocommerce 优惠券?
我正在尝试通过 woocommerce Rest api 创建优惠券: https://woocommerce.github.io/woocommerce-rest-api-docs/#create-a-coupon 我可以很好地创建优惠券,但有效期似乎是......
抱歉,如果之前有人问过这个问题,但谷歌搜索没有给我。 如何保护方法(或属性)仅免受不相关类的影响,但又可用于特定的相关类? c...
Chrome 第三方 cookie 限制 - reCAPTCHA Enterprise
reCAPTCHA Enterprise 是否会受到 2024 年第 3 季度 Chrome 第三方 Cookie 限制的影响? 参考:https://developers.google.com/privacy-sandbox/3pcd 我们通过启用 chrome://
限制消费者应用程序仅访问后端应用程序的一个 API 端点,并限制其他端点的访问
我的后端应用程序有两个使用 springboot 3.x 和 java 17 开发的消费者应用程序。我的前端(FE)消费者应用程序可以访问所有 API 端点,而对于其他应用程序,我想提供 ac...
以及为什么按钮单击有效但在脚本中没有任何效果 感谢您的支持 我还使用了手表和@update模型:吊顶日志湖表面值切片中的值并且所有warks都很好,但在模板中......
在工作中,我正在构建一个用于上传用户视频的表单,他们希望包含一个选项,您可以在其中指定是否允许您的视频嵌入到另一个网站上。有没有办法
公共类LockScreenService扩展服务{ 公共静态最终 int LOCK_SCREEN_SERVICE_NOTIFICATION_ID = 1; 公共静态最终 int SERVICE_NOTIFICATION_PENDING_INTENT_REQUEST_CODE =...
我在命名空间 Classes.Device 中有一个名为 NetworkDevice 的类和一个方法: private void DisplayDeviceDetails(T 设备) { 抛出新的NotImplementedException(); } 如果我得到了
如何应用限制,例如为其他应用程序设置时间限制、阻止移动设备中我的开发应用程序的某些 URL?
我正在尝试构建一个家长控制应用程序,它可以对 Android 设备中的其他应用程序应用限制。限制可以是这样的:- 该应用程序可以限制任何游戏应用程序的打开
有没有一种有效的方法来找到长度为 3 的子序列,其中第一个是最低的,第二个是最大的,最后一个在该范围内?
例如,给定列表 [5, 9, 1, 2, 7, 8],算法应该找到诸如 [5, 9, 7] 或 [5, 9, 8] 之类的子序列。 我需要算法高效。一种方法可能涉及跟踪
I OWL 我想对某个类仅允许一个或另一个子类的情况进行建模。我想建立一个限制模型,允许属性仅像 (A XOR B) OR (some
在Word中,当启用编辑限制时,默认情况下会选中“突出显示可编辑区域”选项,并且可编辑部分将具有浅黄色背景。如何设置编辑
如何加密或保护 terraform 源 tf.我不希望其他人更改或查看 terraform main.tf 文件中的内容。 有没有办法将此 main.tf 转换为可执行文件或加密的
我希望用户只能看到自己的个人资料信息,而不能访问其他用户的信息。我正在使用 test_func 来检查用户登录是否尝试访问配置文件信息...