用于在typescript中对不同事件建模的类型
假设我有以下三个对象:用于在typescript中对不同事件建模的类型,typescript,Typescript,假设我有以下三个对象: { id: 1, time: 1000, type: 'A', data: { a: 'one' } } { id: 2, time: 1001, type: 'B', data: { b: 123 } } { id: 3, time: 1002, type: 'C', data: { c: 'three', d: 123 } } 我想要一个函数,沿着 function buildEvent<TData,TEve
{
id: 1,
time: 1000,
type: 'A',
data: { a: 'one' }
}
{
id: 2,
time: 1001,
type: 'B',
data: { b: 123 }
}
{
id: 3,
time: 1002,
type: 'C',
data: { c: 'three', d: 123 }
}
我想要一个函数,沿着
function buildEvent<TData,TEvent>(id: number, time: number, TData data): TEvent {}
我觉得在这里应该使用联合类型,以及我通常如何使用泛型类型,这让我感到困惑
非常感谢 这个问题还不完全清楚。但是从你的对象和功能我可以假设你的需要,希望是正确的 我遇到的问题是,
buildEvent
没有在所有对象中都可见的type
参数。那样的话,我需要改变这一点,因为对于我们的联盟来说,类型是discriminant
。这意味着它指明了我们应该使用哪些数据
看看休闲解决方案:
// data + type
type TDataA = { type: 'A', data: { a: string } };
type TDataB = { type: 'B', data: { b: number } };
type TDataC = { type: 'C', data: { c: string, d: number } };
type TData = TDataA | TDataB | TDataC
type TBase = {
id: number,
time: number
}
type TEvent = TBase & TData; // our event is a product of Base and Type+Data
// pay attention data argument was changed into typeAndData
function buildEvent<T extends TData>(id: TBase['id'], time: TBase['time'], typeAndData: T): TBase & T {
return {
id,
time,
...typeAndData
}
}
const eventA = buildEvent(1, 1000, { type: 'A', data: { a: 'a' } }); // correct
eventA.data.a // properly has only a
const eventAWrong = buildEvent(1, 1000, { type: 'A', data: { b: 'a' } }); // error - wrong data
const eventB = buildEvent(1, 1000, { type: 'B', data: { b: 11 } }); // correct
真的不清楚你在问什么。您有一个泛型方法签名。您可以随意命名TData和TEvent,如T和E。您可以将每种类型传递给它们。你可能想限制可通行的类型?那么
extends
关键字应该可以帮助您。完美!我现在清楚地看到了我思想中的错误。非常感谢
// data + type
type TDataA = { type: 'A', data: { a: string } };
type TDataB = { type: 'B', data: { b: number } };
type TDataC = { type: 'C', data: { c: string, d: number } };
type TData = TDataA | TDataB | TDataC
type TBase = {
id: number,
time: number
}
type TEvent = TBase & TData; // our event is a product of Base and Type+Data
// pay attention data argument was changed into typeAndData
function buildEvent<T extends TData>(id: TBase['id'], time: TBase['time'], typeAndData: T): TBase & T {
return {
id,
time,
...typeAndData
}
}
const eventA = buildEvent(1, 1000, { type: 'A', data: { a: 'a' } }); // correct
eventA.data.a // properly has only a
const eventAWrong = buildEvent(1, 1000, { type: 'A', data: { b: 'a' } }); // error - wrong data
const eventB = buildEvent(1, 1000, { type: 'B', data: { b: 11 } }); // correct
type BuildEventIsTEvent = ReturnType<typeof buildEvent> extends TEvent ? true : false;
// above evaluates to true