创建函数结果联合的类型

时间:2017-04-17 22:00:58

标签: typescript redux

我有一些函数,我需要函数结果类型的union类型。

实施例

输入函数类型:

type InputType1 = () => {type: "INCREASE"}
type InputType2 = () => {type: "ADD", by: number}

输出类型:

type ResultType = {type: "INCREASE"} | {type: "ADD", by: number}

电流

我目前的代码非常详细,但看起来像这样:

function returntypeof<RT>(expression: (...param: any[]) => RT): RT {
  return {} as RT;
}

const AllTypes = {
  1: returntypeof(InputType1),
  2: returntypeof(InputType2),
};

type ResultType = typeof AllTypes[keyof typeof AllTypes];

1 个答案:

答案 0 :(得分:1)

在variadic可用之前(并想出如何做到这一点),现在你可以试试这个:

blockchain@blockchain-VirtualBox:~/embark$ embark demo
Initializing Embark Template....
Installing packages.. this can take a few seconds
Init complete

App ready at ./embark_demo
-------------------
next steps:
-> cd ./embark_demo
-> embark blockchain or embark simulator
open another console in the same directory and run
-> embark run
For more info go to http://github.com/iurimatias/embark-framework
blockchain@blockchain-VirtualBox:~/embark$ cd embark_demo/
blockchain@blockchain-VirtualBox:~/embark/embark_demo$ embark blockchain
===============================================================================
===============================================================================
Embark Blockchain Using: Go-Ethereum (https://github.com/ethereum/go-ethereum)
===============================================================================
===============================================================================
running: geth --networkid 12301 --datadir=".embark/development/datadir" --password config/development/password account list
WARN [04-18|17:44:26] No etherbase set and no accounts found as default
already initialized
/usr/local/lib/node_modules/embark/node_modules/solc/soljson.js:1
(function (exports, require, module, __filename, __dirname) { var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filena

TypeError: Cannot read property '1' of null
  at Blockchain.initChainAndGetAddress (/usr/local/lib/node_modules/embark/lib/blockchain.js:69:45)
  at Blockchain.run (/usr/local/lib/node_modules/embark/lib/blockchain.js:41:22)
  at Object.blockchain (/usr/local/lib/node_modules/embark/lib/index.js:195:16)
  at Command.<anonymous> (/usr/local/lib/node_modules/embark/lib/cmd.js:95:17)
  at Command.listener (/usr/local/lib/node_modules/embark/node_modules/commander/index.js:301:8)
  at emitTwo (events.js:106:13)
  at Command.emit (events.js:191:7)
  at Command.parseArgs (/usr/local/lib/node_modules/embark/node_modules/commander/index.js:615:12)
  at Command.parse (/usr/local/lib/node_modules/embark/node_modules/commander/index.js:458:21)
  at Cmd.process (/usr/local/lib/node_modules/embark/lib/cmd.js:19:11)
  at Object.process (/usr/local/lib/node_modules/embark/lib/index.js:35:9)
  at Object.<anonymous> (/usr/local/lib/node_modules/embark/bin/embark:4:8)
  at Module._compile (module.js:571:32)
  at Object.Module._extensions..js (module.js:580:10)
  at Module.load (module.js:488:32)
  at tryModuleLoad (module.js:447:12)
  at Function.Module._load (module.js:439:3)
  at Module.runMain (module.js:605:10)
  at run (bootstrap_node.js:420:7)
  at startup (bootstrap_node.js:139:9)
  at bootstrap_node.js:535:3

blockchain@blockchain-VirtualBox:~/embark/embark_demo$ ^C
blockchain@blockchain-VirtualBox:~/embark/embark_demo$ sudo apt-get update
Hit:1 http://ppa.launchpad.net/ethereum/ethereum/ubuntu xenial InRelease
Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
Hit:3 http://ca.archive.ubuntu.com/ubuntu xenial InRelease                          
Get:4 http://ca.archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]        
Get:5 http://ca.archive.ubuntu.com/ubuntu xenial-backports InRelease [102 kB]                
Fetched 306 kB in 0s (317 kB/s)    
Reading package lists... Done
blockchain@blockchain-VirtualBox:~/embark/embark_demo$ cd ..
blockchain@blockchain-VirtualBox:~/embark$ sudo rm -r embark_demo/
blockchain@blockchain-VirtualBox:~/embark$ embark demo
Initializing Embark Template....
Installing packages.. this can take a few seconds
Init complete

App ready at ./embark_demo
-------------------
next steps:
-> cd ./embark_demo
-> embark blockchain or embark simulator
open another console in the same directory and run
-> embark run
For more info go to http://github.com/iurimatias/embark-framework
blockchain@blockchain-VirtualBox:~/embark$ cd embark_demo/
blockchain@blockchain-VirtualBox:~/embark/embark_demo$ embark blockchain
===============================================================================
===============================================================================
Embark Blockchain Using: Go-Ethereum (https://github.com/ethereum/go-ethereum)
===============================================================================
===============================================================================
running: geth --networkid 12301 --datadir=".embark/development/datadir" --password config/development/password account list
WARN [04-18|17:45:59] No etherbase set and no accounts found as default
already initialized
/usr/local/lib/node_modules/embark/node_modules/solc/soljson.js:1
(function (exports, require, module, __filename, __dirname) { var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filena

TypeError: Cannot read property '1' of null
  at Blockchain.initChainAndGetAddress (/usr/local/lib/node_modules/embark/lib/blockchain.js:69:45)
  at Blockchain.run (/usr/local/lib/node_modules/embark/lib/blockchain.js:41:22)
  at Object.blockchain (/usr/local/lib/node_modules/embark/lib/index.js:195:16)
  at Command.<anonymous> (/usr/local/lib/node_modules/embark/lib/cmd.js:95:17)
  at Command.listener (/usr/local/lib/node_modules/embark/node_modules/commander/index.js:301:8)
  at emitTwo (events.js:106:13)
  at Command.emit (events.js:191:7)
  at Command.parseArgs (/usr/local/lib/node_modules/embark/node_modules/commander/index.js:615:12)
  at Command.parse (/usr/local/lib/node_modules/embark/node_modules/commander/index.js:458:21)
  at Cmd.process (/usr/local/lib/node_modules/embark/lib/cmd.js:19:11)
  at Object.process (/usr/local/lib/node_modules/embark/lib/index.js:35:9)
  at Object.<anonymous> (/usr/local/lib/node_modules/embark/bin/embark:4:8)
  at Module._compile (module.js:571:32)
  at Object.Module._extensions..js (module.js:580:10)
  at Module.load (module.js:488:32)
  at tryModuleLoad (module.js:447:12)
  at Function.Module._load (module.js:439:3)
  at Module.runMain (module.js:605:10)
  at run (bootstrap_node.js:420:7)
  at startup (bootstrap_node.js:139:9)
  at bootstrap_node.js:535:3