Type Aliases
Aliasing types for reuse
When you have complicated types that you want to reuse in multiple places, you can alias them in Flow using a type alias.
1 2 3 4 5 6 |
|
{"value":"// @flow\ntype MyObject = {\n foo: number,\n bar: boolean,\n baz: string,\n};\n","tokens":[{"type":"Line","context":"comment","value":"// @flow","line":1,"start":0,"end":8},{"type":"T_TYPE","context":"normal","value":"type","line":2,"start":9,"end":13},{"type":"T_IDENTIFIER","context":"type","value":"MyObject","line":2,"start":14,"end":22},{"type":"T_ASSIGN","context":"type","value":"=","line":2,"start":23,"end":24},{"type":"T_LCURLY","context":"type","value":"{","line":2,"start":25,"end":26},{"type":"T_IDENTIFIER","context":"normal","value":"foo","line":3,"start":29,"end":32},{"type":"T_COLON","context":"type","value":":","line":3,"start":32,"end":33},{"type":"T_NUMBER_TYPE","context":"type","value":"number","line":3,"start":34,"end":40},{"type":"T_COMMA","context":"type","value":",","line":3,"start":40,"end":41},{"type":"T_IDENTIFIER","context":"normal","value":"bar","line":4,"start":44,"end":47},{"type":"T_COLON","context":"type","value":":","line":4,"start":47,"end":48},{"type":"T_BOOLEAN_TYPE","context":"type","value":"boolean","line":4,"start":49,"end":56},{"type":"T_COMMA","context":"type","value":",","line":4,"start":56,"end":57},{"type":"T_IDENTIFIER","context":"normal","value":"baz","line":5,"start":60,"end":63},{"type":"T_COLON","context":"type","value":":","line":5,"start":63,"end":64},{"type":"T_STRING_TYPE","context":"type","value":"string","line":5,"start":65,"end":71},{"type":"T_COMMA","context":"type","value":",","line":5,"start":71,"end":72},{"type":"T_RCURLY","context":"type","value":"}","line":6,"start":73,"end":74},{"type":"T_SEMICOLON","context":"normal","value":";","line":6,"start":74,"end":75}],"errors":[]}
These type aliases can be used anywhere a type can be used.
1 2 3 4 5 6 7 8 |
|
{"value":"// @flow\ntype MyObject = {\n // ...\n};\n\nvar val: MyObject = { /* ... */ };\nfunction method(val: MyObject) { /* ... */ }\nclass Foo { constructor(val: MyObject) { /* ... */ } }\n","tokens":[{"type":"Line","context":"comment","value":"// @flow","line":1,"start":0,"end":8},{"type":"T_TYPE","context":"normal","value":"type","line":2,"start":9,"end":13},{"type":"T_IDENTIFIER","context":"type","value":"MyObject","line":2,"start":14,"end":22},{"type":"T_ASSIGN","context":"type","value":"=","line":2,"start":23,"end":24},{"type":"T_LCURLY","context":"type","value":"{","line":2,"start":25,"end":26},{"type":"Line","context":"comment","value":"// ...","line":3,"start":29,"end":35},{"type":"T_RCURLY","context":"type","value":"}","line":4,"start":36,"end":37},{"type":"T_SEMICOLON","context":"normal","value":";","line":4,"start":37,"end":38},{"type":"T_VAR","context":"normal","value":"var","line":6,"start":40,"end":43},{"type":"T_IDENTIFIER","context":"normal","value":"val","line":6,"start":44,"end":47},{"type":"T_COLON","context":"type","value":":","line":6,"start":47,"end":48},{"type":"T_IDENTIFIER","context":"type","value":"MyObject","line":6,"start":49,"end":57},{"type":"T_ASSIGN","context":"normal","value":"=","line":6,"start":58,"end":59},{"type":"T_LCURLY","context":"normal","value":"{","line":6,"start":60,"end":61},{"type":"Block","context":"comment","value":"/* ... */","line":6,"start":62,"end":71},{"type":"T_RCURLY","context":"normal","value":"}","line":6,"start":72,"end":73},{"type":"T_SEMICOLON","context":"normal","value":";","line":6,"start":73,"end":74},{"type":"T_FUNCTION","context":"normal","value":"function","line":7,"start":75,"end":83},{"type":"T_IDENTIFIER","context":"normal","value":"method","line":7,"start":84,"end":90},{"type":"T_LPAREN","context":"normal","value":"(","line":7,"start":90,"end":91},{"type":"T_IDENTIFIER","context":"normal","value":"val","line":7,"start":91,"end":94},{"type":"T_COLON","context":"type","value":":","line":7,"start":94,"end":95},{"type":"T_IDENTIFIER","context":"type","value":"MyObject","line":7,"start":96,"end":104},{"type":"T_RPAREN","context":"normal","value":")","line":7,"start":104,"end":105},{"type":"T_LCURLY","context":"normal","value":"{","line":7,"start":106,"end":107},{"type":"Block","context":"comment","value":"/* ... */","line":7,"start":108,"end":117},{"type":"T_RCURLY","context":"normal","value":"}","line":7,"start":118,"end":119},{"type":"T_CLASS","context":"normal","value":"class","line":8,"start":120,"end":125},{"type":"T_IDENTIFIER","context":"normal","value":"Foo","line":8,"start":126,"end":129},{"type":"T_LCURLY","context":"normal","value":"{","line":8,"start":130,"end":131},{"type":"T_IDENTIFIER","context":"normal","value":"constructor","line":8,"start":132,"end":143},{"type":"T_LPAREN","context":"normal","value":"(","line":8,"start":143,"end":144},{"type":"T_IDENTIFIER","context":"normal","value":"val","line":8,"start":144,"end":147},{"type":"T_COLON","context":"type","value":":","line":8,"start":147,"end":148},{"type":"T_IDENTIFIER","context":"type","value":"MyObject","line":8,"start":149,"end":157},{"type":"T_RPAREN","context":"normal","value":")","line":8,"start":157,"end":158},{"type":"T_LCURLY","context":"normal","value":"{","line":8,"start":159,"end":160},{"type":"Block","context":"comment","value":"/* ... */","line":8,"start":161,"end":170},{"type":"T_RCURLY","context":"normal","value":"}","line":8,"start":171,"end":172},{"type":"T_RCURLY","context":"normal","value":"}","line":8,"start":173,"end":174}],"errors":[]}
Type Alias Syntax
Type aliases are created using the keyword type
followed by its name, an
equals sign =
, and a type definition.
1 |
|
{"value":"type Alias = Type;\n","tokens":[{"type":"T_TYPE","context":"normal","value":"type","line":1,"start":0,"end":4},{"type":"T_IDENTIFIER","context":"type","value":"Alias","line":1,"start":5,"end":10},{"type":"T_ASSIGN","context":"type","value":"=","line":1,"start":11,"end":12},{"type":"T_IDENTIFIER","context":"type","value":"Type","line":1,"start":13,"end":17},{"type":"T_SEMICOLON","context":"normal","value":";","line":1,"start":17,"end":18}],"errors":[]}
Any type can appear inside a type alias.
1 2 3 4 5 6 7 |
|
{"value":"type NumberAlias = number;\ntype ObjectAlias = {\n property: string,\n method(): number,\n};\ntype UnionAlias = 1 | 2 | 3;\ntype AliasAlias = ObjectAlias;\n","tokens":[{"type":"T_TYPE","context":"normal","value":"type","line":1,"start":0,"end":4},{"type":"T_IDENTIFIER","context":"type","value":"NumberAlias","line":1,"start":5,"end":16},{"type":"T_ASSIGN","context":"type","value":"=","line":1,"start":17,"end":18},{"type":"T_NUMBER_TYPE","context":"type","value":"number","line":1,"start":19,"end":25},{"type":"T_SEMICOLON","context":"normal","value":";","line":1,"start":25,"end":26},{"type":"T_TYPE","context":"normal","value":"type","line":2,"start":27,"end":31},{"type":"T_IDENTIFIER","context":"type","value":"ObjectAlias","line":2,"start":32,"end":43},{"type":"T_ASSIGN","context":"type","value":"=","line":2,"start":44,"end":45},{"type":"T_LCURLY","context":"type","value":"{","line":2,"start":46,"end":47},{"type":"T_IDENTIFIER","context":"normal","value":"property","line":3,"start":50,"end":58},{"type":"T_COLON","context":"type","value":":","line":3,"start":58,"end":59},{"type":"T_STRING_TYPE","context":"type","value":"string","line":3,"start":60,"end":66},{"type":"T_COMMA","context":"type","value":",","line":3,"start":66,"end":67},{"type":"T_IDENTIFIER","context":"normal","value":"method","line":4,"start":70,"end":76},{"type":"T_LPAREN","context":"type","value":"(","line":4,"start":76,"end":77},{"type":"T_RPAREN","context":"type","value":")","line":4,"start":77,"end":78},{"type":"T_COLON","context":"type","value":":","line":4,"start":78,"end":79},{"type":"T_NUMBER_TYPE","context":"type","value":"number","line":4,"start":80,"end":86},{"type":"T_COMMA","context":"type","value":",","line":4,"start":86,"end":87},{"type":"T_RCURLY","context":"type","value":"}","line":5,"start":88,"end":89},{"type":"T_SEMICOLON","context":"normal","value":";","line":5,"start":89,"end":90},{"type":"T_TYPE","context":"normal","value":"type","line":6,"start":91,"end":95},{"type":"T_IDENTIFIER","context":"type","value":"UnionAlias","line":6,"start":96,"end":106},{"type":"T_ASSIGN","context":"type","value":"=","line":6,"start":107,"end":108},{"type":"T_NUMBER_SINGLETON_TYPE","context":"type","value":"1","line":6,"start":109,"end":110},{"type":"T_BIT_OR","context":"type","value":"|","line":6,"start":111,"end":112},{"type":"T_NUMBER_SINGLETON_TYPE","context":"type","value":"2","line":6,"start":113,"end":114},{"type":"T_BIT_OR","context":"type","value":"|","line":6,"start":115,"end":116},{"type":"T_NUMBER_SINGLETON_TYPE","context":"type","value":"3","line":6,"start":117,"end":118},{"type":"T_SEMICOLON","context":"normal","value":";","line":6,"start":118,"end":119},{"type":"T_TYPE","context":"normal","value":"type","line":7,"start":120,"end":124},{"type":"T_IDENTIFIER","context":"type","value":"AliasAlias","line":7,"start":125,"end":135},{"type":"T_ASSIGN","context":"type","value":"=","line":7,"start":136,"end":137},{"type":"T_IDENTIFIER","context":"type","value":"ObjectAlias","line":7,"start":138,"end":149},{"type":"T_SEMICOLON","context":"normal","value":";","line":7,"start":149,"end":150}],"errors":[]}
Type Alias Generics
Type aliases can also have their own generics.
1 2 3 4 |
|
{"value":"type MyObject<A, B, C> = {\n property: A,\n method(val: B): C,\n};\n","tokens":[{"type":"T_TYPE","context":"normal","value":"type","line":1,"start":0,"end":4},{"type":"T_IDENTIFIER","context":"type","value":"MyObject","line":1,"start":5,"end":13},{"type":"T_LESS_THAN","context":"type","value":"<","line":1,"start":13,"end":14},{"type":"T_IDENTIFIER","context":"type","value":"A","line":1,"start":14,"end":15},{"type":"T_COMMA","context":"type","value":",","line":1,"start":15,"end":16},{"type":"T_IDENTIFIER","context":"type","value":"B","line":1,"start":17,"end":18},{"type":"T_COMMA","context":"type","value":",","line":1,"start":18,"end":19},{"type":"T_IDENTIFIER","context":"type","value":"C","line":1,"start":20,"end":21},{"type":"T_GREATER_THAN","context":"type","value":">","line":1,"start":21,"end":22},{"type":"T_ASSIGN","context":"type","value":"=","line":1,"start":23,"end":24},{"type":"T_LCURLY","context":"type","value":"{","line":1,"start":25,"end":26},{"type":"T_IDENTIFIER","context":"normal","value":"property","line":2,"start":29,"end":37},{"type":"T_COLON","context":"type","value":":","line":2,"start":37,"end":38},{"type":"T_IDENTIFIER","context":"type","value":"A","line":2,"start":39,"end":40},{"type":"T_COMMA","context":"type","value":",","line":2,"start":40,"end":41},{"type":"T_IDENTIFIER","context":"normal","value":"method","line":3,"start":44,"end":50},{"type":"T_LPAREN","context":"type","value":"(","line":3,"start":50,"end":51},{"type":"T_IDENTIFIER","context":"normal","value":"val","line":3,"start":51,"end":54},{"type":"T_COLON","context":"type","value":":","line":3,"start":54,"end":55},{"type":"T_IDENTIFIER","context":"type","value":"B","line":3,"start":56,"end":57},{"type":"T_RPAREN","context":"type","value":")","line":3,"start":57,"end":58},{"type":"T_COLON","context":"type","value":":","line":3,"start":58,"end":59},{"type":"T_IDENTIFIER","context":"type","value":"C","line":3,"start":60,"end":61},{"type":"T_COMMA","context":"type","value":",","line":3,"start":61,"end":62},{"type":"T_RCURLY","context":"type","value":"}","line":4,"start":63,"end":64},{"type":"T_SEMICOLON","context":"normal","value":";","line":4,"start":64,"end":65}],"errors":[]}
Type alias generics are parameterized. When you use a type alias you need to pass parameters for each of its generics.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
{"value":"// @flow\ntype MyObject<A, B, C> = {\n foo: A,\n bar: B,\n baz: C,\n};\n\nvar val: MyObject<number, boolean, string> = {\n foo: 1,\n bar: true,\n baz: 'three',\n};\n","tokens":[{"type":"Line","context":"comment","value":"// @flow","line":1,"start":0,"end":8},{"type":"T_TYPE","context":"normal","value":"type","line":2,"start":9,"end":13},{"type":"T_IDENTIFIER","context":"type","value":"MyObject","line":2,"start":14,"end":22},{"type":"T_LESS_THAN","context":"type","value":"<","line":2,"start":22,"end":23},{"type":"T_IDENTIFIER","context":"type","value":"A","line":2,"start":23,"end":24},{"type":"T_COMMA","context":"type","value":",","line":2,"start":24,"end":25},{"type":"T_IDENTIFIER","context":"type","value":"B","line":2,"start":26,"end":27},{"type":"T_COMMA","context":"type","value":",","line":2,"start":27,"end":28},{"type":"T_IDENTIFIER","context":"type","value":"C","line":2,"start":29,"end":30},{"type":"T_GREATER_THAN","context":"type","value":">","line":2,"start":30,"end":31},{"type":"T_ASSIGN","context":"type","value":"=","line":2,"start":32,"end":33},{"type":"T_LCURLY","context":"type","value":"{","line":2,"start":34,"end":35},{"type":"T_IDENTIFIER","context":"normal","value":"foo","line":3,"start":38,"end":41},{"type":"T_COLON","context":"type","value":":","line":3,"start":41,"end":42},{"type":"T_IDENTIFIER","context":"type","value":"A","line":3,"start":43,"end":44},{"type":"T_COMMA","context":"type","value":",","line":3,"start":44,"end":45},{"type":"T_IDENTIFIER","context":"normal","value":"bar","line":4,"start":48,"end":51},{"type":"T_COLON","context":"type","value":":","line":4,"start":51,"end":52},{"type":"T_IDENTIFIER","context":"type","value":"B","line":4,"start":53,"end":54},{"type":"T_COMMA","context":"type","value":",","line":4,"start":54,"end":55},{"type":"T_IDENTIFIER","context":"normal","value":"baz","line":5,"start":58,"end":61},{"type":"T_COLON","context":"type","value":":","line":5,"start":61,"end":62},{"type":"T_IDENTIFIER","context":"type","value":"C","line":5,"start":63,"end":64},{"type":"T_COMMA","context":"type","value":",","line":5,"start":64,"end":65},{"type":"T_RCURLY","context":"type","value":"}","line":6,"start":66,"end":67},{"type":"T_SEMICOLON","context":"normal","value":";","line":6,"start":67,"end":68},{"type":"T_VAR","context":"normal","value":"var","line":8,"start":70,"end":73},{"type":"T_IDENTIFIER","context":"normal","value":"val","line":8,"start":74,"end":77},{"type":"T_COLON","context":"type","value":":","line":8,"start":77,"end":78},{"type":"T_IDENTIFIER","context":"type","value":"MyObject","line":8,"start":79,"end":87},{"type":"T_LESS_THAN","context":"type","value":"<","line":8,"start":87,"end":88},{"type":"T_NUMBER_TYPE","context":"type","value":"number","line":8,"start":88,"end":94},{"type":"T_COMMA","context":"type","value":",","line":8,"start":94,"end":95},{"type":"T_BOOLEAN_TYPE","context":"type","value":"boolean","line":8,"start":96,"end":103},{"type":"T_COMMA","context":"type","value":",","line":8,"start":103,"end":104},{"type":"T_STRING_TYPE","context":"type","value":"string","line":8,"start":105,"end":111},{"type":"T_GREATER_THAN","context":"type","value":">","line":8,"start":111,"end":112},{"type":"T_ASSIGN","context":"normal","value":"=","line":8,"start":113,"end":114},{"type":"T_LCURLY","context":"normal","value":"{","line":8,"start":115,"end":116},{"type":"T_IDENTIFIER","context":"normal","value":"foo","line":9,"start":119,"end":122},{"type":"T_COLON","context":"normal","value":":","line":9,"start":122,"end":123},{"type":"T_NUMBER","context":"normal","value":"1","line":9,"start":124,"end":125},{"type":"T_COMMA","context":"normal","value":",","line":9,"start":125,"end":126},{"type":"T_IDENTIFIER","context":"normal","value":"bar","line":10,"start":129,"end":132},{"type":"T_COLON","context":"normal","value":":","line":10,"start":132,"end":133},{"type":"T_TRUE","context":"normal","value":"true","line":10,"start":134,"end":138},{"type":"T_COMMA","context":"normal","value":",","line":10,"start":138,"end":139},{"type":"T_IDENTIFIER","context":"normal","value":"baz","line":11,"start":142,"end":145},{"type":"T_COLON","context":"normal","value":":","line":11,"start":145,"end":146},{"type":"T_STRING","context":"normal","value":"'three'","line":11,"start":147,"end":154},{"type":"T_COMMA","context":"normal","value":",","line":11,"start":154,"end":155},{"type":"T_RCURLY","context":"normal","value":"}","line":12,"start":156,"end":157},{"type":"T_SEMICOLON","context":"normal","value":";","line":12,"start":157,"end":158}],"errors":[]}
Was this guide helpful? Let us know by sending a message to @flowtype.