通常,类型保护的类型定义如下:
(value: unknown) => value is Type
Run Code Online (Sandbox Code Playgroud)
其中突出显示的部分被文档称为类型谓词:
(value: unknown) => **value is Type**
Run Code Online (Sandbox Code Playgroud)
甚至更进一步,我们可以说(我不知道文档是如何定义这一点的)是valuetypeguard 的参数,is是用于定义类型谓词的 TypeScript 二元运算符/关键字,并且Type是 typeguard 实际保证的类型,保证型。由于我们使用类型保护来保证值的类型,因此我们可以说这Type是定义中最有趣的部分。
既然如此,是否可以Type从类型保护的类型定义中提取出来?如何?
我在想这样的事情:
type Type = typeof typeguard; // (value: unknown) => value is Type
type TypePredicate = TypePredicateOf<Type>; // value is Type
type GuaranteedType = IsOf<TypePredicate>; // Type
Run Code Online (Sandbox Code Playgroud)
GuaranteedType想要的结果在哪里。
谷歌搜索后,我只找到了有关通用类型保护类型定义的答案,但没有找到如何Type从中获取该部分。
它只发生在#toString, 并且只有当我(尝试)通过missingMethod-like访问它时trap。
我有一个工厂createIterface,它返回一个Proxy具有大量方法的对象。在这些方法中,我有#toString()和#id()。#id返回interface与调用者具有相同属性的 并且工作正常;#toString应该将 my 转换interface为字符串,但它失败了。Allinterface的方法——包括#id和#toString——都在一个#Symbol.for("__methods")属性中。我这样做是为了调试的目的:
const __methods = Symbol.for("__methods");
const missingMethod = ({
get: (obj, prop) => Reflect.has(obj, prop)
? Reflect.get(obj, prop)
: Reflect.has(obj[__methods], prop)
? Reflect.get(obj[__methods], prop)
: console.log(`No #${prop} property exists.`)
});
const createInterface = (...props) => new Proxy({
...props,
[__methods]: {
id: () => createInterface (...props), …Run Code Online (Sandbox Code Playgroud)