- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Tôi đang sử dụng io-ts
时遇到一些问题。我发现它确实缺乏文档,我取得的大部分进展都是通过 GitHub issues 取得的。不,我不明白 HKT,所以没有帮助。
基本上,我在其他地方创建一个类型,kiểu
,它具有一组特定的键:
import * as S from 'io-ts/lib/Schema'
const someType = S.make(S => S.type({
id: S.string,
foo: S.string,
bar: S.boolean
}))
type T = S.TypeOf
我需要将其转换为仍需要一些键的phần。假设仍然需要 nhận dạng
键,则在 TS 中定义类型如下:
type PartlyPartial = Partial & { id: string }
简单!
现在,我希望能够通过 io-ts 在运行时执行此操作,以便我可以使用 Guard
模块创建验证器函数。这是我到目前为止所得到的:
import * as G from 'io-ts/lib/Guard'
const propsBase = S.make(S => S.type({
id: S.string
}))
const partial = S.make(S => S.intersection(
someType(S) // needs to be partial,
propsBase(S)
))
// So that this returns `true`
partial(G.guard).is({
id: 'some id',
bar: true
})
Nhưng someType(S)
将类型定义为具有所需的所有键,但其中没有一个是必需的。
这让我发疯,任何帮助将不胜感激!
1 Câu trả lời
我不是 io-ts 方面的专家,但仔细观察一下,我认为这不是一件容易实现的事情。 Schemable
中的方法从其他架构中构建架构。 type()
方法需要 của cải
对象,其键是所需对象的键,其属性对于每个属性都是可架构的。 partial()
方法采用相同的 của cải
对象,但构建一个可架构,其中属性是可选的。您可以看到这些如何允许您构建架构;你有一个của cải
包含您需要测试的所有键的对象。
但给定类型 T
的架构,一般不可能将其转换为 Partial
. của cải
传入 type()
的对象在其结果中不可访问。它已经丢失了;扔掉。比如说,如果您拥有的只是一个返回 ĐÚNG VẬY
的类型保护函数。当且仅当给定 T
类型的值时,您不能使用该函数来创建另一个生成 ĐÚNG VẬY
的函数当且仅当给定 Partial
类型的值时。您需要T
的更多详细信息来自守卫功能之外的某些来源,例如 của cải
现在已经消失的对象。
因此,您无法直接组合架构来完成此任务。
执行此操作的唯一方法是编写您自己的 Schemable
存储了有关 Schema
的足够信息调用它以便它可以返回一个新模式,例如对 S.type()
的顶级调用替换为对 S.partial()
的调用。如果您想查看跨并集或向下到交叉点的部分分布,即使这样也不是完美的。本质上它必须对Schema
进行手术。 ,展开对 S.type()
的顶级调用找到迷失的地方của cải
对象,并用 S.partial()
重新包装它。
很容易就能将所有调用转为 S.type()
Đi vàoS.partial()
(只需将旧架构替换为新架构,其 kiểu
属性是 một phần
属性的副本),但这最终会使任何嵌套对象以及顶级对象成为部分对象。
这是我所做的可怕的事情,但似乎有效:
import { URIS, Kind } from "fp-ts/lib/HKT";
function partial(obj: S.Schema): S.Schema<>> {
const partSchemable = (S: Schemable) =>
Object.assign({}, S, {
type: (properties: any) =>
Object.assign(S.type(properties), { properties })
});
return (S: Schemable) => {
let a = obj(partSchemable(S)) as Kind & { properties?: any };
return "properties" in a ? S.partial(a.properties) : a;
};
}
它产生了一个新的 Schemable
跟踪 của cải
对象传递到其 type()
方法并将其作为属性添加到结果中。那么,如果顶级结果Một
有这样一个của cải
属性(property),我们返回S.partial(a.properties)
放在上面而不是 Một
.
我们可以按如下方式测试它的工作原理。首先我将增强someType
使用嵌套对象,这样我们就可以向自己证明只有顶级 S.type()
转换为 S.partial()
:
const someType = S.make(S =>
S.type({
id: S.string,
foo: S.string,
bar: S.boolean,
baz: S.type({ a: S.string })
})
);
然后我会做 myPartialType
(这就是您所说的 một phần
):
const myPartialType = S.make(S => S.intersection(partial(someType)(S), propsBase(S)));
最后是一个测试函数(使用 log()
函数将内容放入我将在底部链接的 stackblitz 代码中的浏览器窗口中):
const test = (x: any) => {
log(JSON.stringify(x), myPartialType(G.guard).is(x));
};
test({ foo: "" }); // false
test({ id: "", foo: "" }); // true
test({ id: "", foo: "", bar: "" }); // false
test({ id: "", foo: "", bar: false }); // true
test({ id: "", baz: {} }); // false
test({ id: "", baz: { a: "" } }); // true
所以,这些有效。耶?我猜。
我的问题是:你有多需要这个?给出您的示例代码以及需要做什么才能开始接近通用partial()
,我强烈建议首先制作模式的两个版本,如下所示:
const props = (S: Schemable) => ({
id: S.string,
foo: S.string,
bar: S.boolean,
baz: S.type({ a: S.string })
});
const someTypeRequired = S.make(S => S.type(props(S)));
const someTypePartial = S.make(S => S.partial(props(S)));
const easierPartialType = S.make(S =>
S.intersection(someTypePartial(S), propsBase(S))
);
在这里,我们保留了 của cải
我们自己反对,这样我们就可以在以后使用它两次,而不是在扔掉它后需要重新恢复它。它产生与以前相同的结果:
easierTest({ foo: "" }); // false
easierTest({ id: "", foo: "" }); // true
easierTest({ id: "", foo: "", bar: "" }); // false
easierTest({ id: "", foo: "", bar: false }); // true
easierTest({ id: "", baz: {} }); // false
easierTest({ id: "", baz: { a: "" } }); // true
但这个版本不太容易出错。
好的,希望有帮助;祝你好运!
关于typescript - A 部分 部分 io-ts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61311182/
我已经写了并且 npm 发布了这个:https://github.com/justin-calleja/pkg-dependents 现在我正在用 Typescript 编写这个包:https://g
我有一个函数,我想在 TypeScript 中模拟它以进行测试。在我的测试中,我只关心 json和 status .但是,当使用 Jest 的 jest.spyOn 时我的模拟函数的类型设置为返回 h
我正在使用一个库 (Axios),它的包中包含 Typescript 声明。 我想声明一个将 AxiosResponse(在库的 .d.ts 文件中声明)作为参数的函数。我有以下内容: functio
我是 Typescript 的新手。我想使用 将一个 Typescript 文件加载到另一个 Typescript 文件中标签。 我做了一些事情,但它不起作用!请帮助我。 first.ts: imp
为什么我会收到下面屏幕截图中显示的错误? Atom 说我的 tsconfig.json“项目文件包含无效选项”用于 allowJs、buildOnSave 和 compileOnSave。 但是应该允
所以我正在创建一个 TypeScript 库,我可以轻松地将所有生成的 JS 文件编译成一个文件。有没有办法将所有 .ts 和 .d.ts 编译成一个 .ts 文件? 除了支持 JS 的版本(较少的智
Microsoft Research 提供了一种名为Safer TypeScript 的新 TypeScript 编译器变体: http://research.microsoft.com/en-us/
我需要这个来在单个文件中分发 TypeScript 中的库。有没有办法将多个 typescript 文件合并到(一个js文件+一个 typescript 定义)文件中? 最佳答案 要创建一个库,您可以
用例:我想知道一个函数在 typescript 中执行需要多少时间。我想为此目的使用装饰器。我希望装饰器应该返回时间以便(我可以进一步使用它),而不仅仅是打印它。 例如: export functio
我想检查一个类型是否可以为 null,以及它是否具有值的条件类型。 我尝试实现 type IsNullable = T extends null ? true : false; 但是好像不行 type
我的问题是基于这个 question and answer 假设我们有下一个代码: const myFn = (p: { a: (n: number) => T, b: (o: T) => v
我知道双重否定前缀,我知道 TypeScript 的单后缀(非空断言)。 但是这个双后缀感叹号是什么? /.*验证码为(\d{6}).*/.exec(email.body!!)!![1] 取自here
我正在使用以下文件结构在 Webstorm 中开发一个项目 | src | ... | many files | types | SomeInterface |
在 TypeScript 类中,可以为属性声明类型,例如: class className { property: string; }; 如何在对象字面量中声明属性的类型? 我试过下面的代码,但它
我正在寻找一种在不丢失推断类型信息的情况下将 TypeScript 中的文字值限制为特定类型的好方法。 让我们考虑一个类型Named,它保证有一个名字。 type Named = { name:
在 TypeScript 中,我想创建一个联合类型来表示属于一个或多个不同类型的值,类似于 oneOf在 OpenAPI或 JSON Schema .根据a previous answer on a
type Func = (foo:string) => void // function expression const myFunctionExpression:Func = function(f
假设我有一个联合类型,我正在使用类似 reducer 的 API 调用模式,看起来像这样: type Action = { request: { action: "create
我在 typescript 中有以下去抖功能: export function debounce( callback: (...args: any[]) => void, wait: numb
在 Vue3 的 defineComponent 函数中,第一个泛型参数是 Props,所以我在这里使用 Typescript 接口(interface)提供我的 props 类型。喜欢: expor
Tôi là một lập trình viên xuất sắc, rất giỏi!