typescript - 返回从数组参数中输入的键定义的选择类型的函数
问题描述
所以我认为我对这个不走运,但我想在放弃这个想法之前我会在这里试一试。
我正在尝试创建一个函数,在其中给它一个泛型,然后将一个数组作为参数,并从泛型类型中选择所需的键。像这样的东西。
type Test = {
a: boolean;
b: boolean;
c: boolean;
};
const t = use<Test>(["a", "b"]);
t.a = true;
t.b = true;
t.c = true; // `use` shall not let c be available. This should throw a typescript build error
如果有人对此有解决方案,则通用休息参数也是可能的。
use<Test, "a" | "b">(["a", "b"]);
是迄今为止我发现的唯一有效的解决方案,但它真的很难看。
解决方案
棘手的是,我看到的问题是 Typescript 似乎不允许您部分提供泛型,您要么必须显式提供它们,要么隐式获取它们。最好有一些像 <string, ?> 这样的语法。这是我能做的最好的
function use<Q, S extends keyof Q>(
q: Q,
properties: S[]
): {
[K in S]: Q[K];
} {
return {} as any;
}
type Test = {
a: boolean;
b: boolean;
c: boolean;
};
const t = use(<Test>null, ["a", "b"]);
或者(我认为这更好)
function use<Q>(): <S extends keyof Q>(p: S[]) => { [K in S]: Q[K] } {
return {} as any;
}
type Test = {
a: boolean;
b: boolean;
c: boolean;
};
const t = use<Test>()(["a", "b"]);
希望有人可以向我们展示光明
推荐阅读
- c# - 如何在不使用 ScopeFactory 的情况下将服务注入 HostedService?
- jquery - 为什么 jQuery Ajax 不能正确处理?
- c# - Renci.SshNet C# Connect 方法适用于环回,但在所有其他 IP 地址上超时
- python-3.x - 计算 Pandas 数据框中不同行数的最简单方法?
- laravel - Laravel 无法显示图片
- javascript - 当 `componentDidUpdate` 中有一个长时间运行的函数时,React 在`render` 期间不会更新 DOM
- django - 将 Wagtail 添加到现有 Django 项目时更改默认主页
- javascript - 为什么我会收到此代码的 MongoDB 重复键错误?
- sql - 如何查看 SEQUENCE 脚本
- python - 使用 Python 生成 Ansible YAML 文件