【发布时间】:2021-07-30 03:41:34
【问题描述】:
我刚开始使用 Typescript,但不知道如何根据函数输入动态地在对象上设置粒度类型。
type Options<T1, T2> = {
name: string;
transforms: Record<string, {
from: (val: T1) => T2,
to: (val: T2) => T1,
}>;
};
type IO<T> = {
read:() => T;
write: (value: T) => void;
}
function transformer<T1, T2>(options: Options<T1, T2>, value: T1) {
const { name, transforms = {}} = options;
// How do I type this as follows:
// - Has key `name` and return type `IO<T1>`
// - Transforms have key [dynamic name], and whatever IO<"return value of from">
type Values = {
[name/* exact value of name?? */]: IO<T1>,
[FromReturnType<tr>/*??*/ in transforms]: IO<tr>,
};
const values: Values = {
[name]: {
read: () => value,
write: (v) => value = v,
},
};
for (const transform in transforms) {
const { to, from } = transforms[transform];
values[transform] = {
read: () => from(value),
write: (v) => value = to(v),
};
}
return values;
}
然后消费者将按如下方式使用该函数:
// Usage
const { number, string, ...otherTypedTransforms } = transformer({
name: "number",
transforms: {
string: {
to: Number,
from: String,
},
// Other transforms with different `from` types
// ...
},
}, 0);
希望 tsc 可以基于 from() 转换将 number.read() 推断为 number 类型和 string.read() 类型 string 等。
我已经完成了许多关于 SO 的问答,但都没有成功。
【问题讨论】:
-
您能否为您的
transformer函数提供所需输入和输出类型的示例?