Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在typescript中对不同事件建模的类型_Typescript - Fatal编程技术网

用于在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