【发布时间】:2021-09-30 20:38:54
【问题描述】:
我的应用程序中有一个用例,我希望能够使用简单的 TypeScript 泛型指定消息结构,并附带一个简单的消息工厂。我想出了以下几点:
export type Message<
T extends string,
P extends Record<string, any> = Record<string, never>
> = {
type: T;
payload: P;
};
export const msg = <M extends Message<string, Record<string, any>>>(
type: M['type'],
payload: M['payload']
): M => ({ type, payload });
type UserRegistered = Message<'UserRegistered', { name: string }>;
const message = <UserRegistered>msg('UserRegistered', { name: 'Test' });
但我在 ): M => ({ type, payload }); 行上遇到 TS2322 错误:
错误 TS2322: 类型 '{ type: M["type"];有效载荷:M[“有效载荷”]; }' 不可分配给类型 'M'。 '{ 类型:M[“类型”];有效载荷:M[“有效载荷”]; }' 可分配给“M”类型的约束,但“M”可以用约束“Message
>”的不同子类型来实例化。
我正在努力弄清楚这可能是一种类型安全风险,以及为什么它不能转换,因为我本质上是在解构和重构相同的类型。
(如果您质疑这个瘦工厂层的实用性,我指望它通过大量预构建的命名工厂函数帮助可维护性)
【问题讨论】:
标签: typescript generics type-inference typescript-generics