TypeScript will let us know, // Before the component mounts, we initialise our state. Bio should be set to a default value. Type 'string' is not assignable to type 'Date'. No matter your level of experience with TypeScript, this guide is here to help you out. However, when writing the typical pattern of constructors and super calls in TypeScripts strict mode, recursion arrendamento inquilinos contratos prazo preocupa fibonacci Property 'text' is missing in type '{ important: true; }' but required in type 'MessageProps'.

As the name suggests, the component is defined as a JavaScript function where its first argument is a props object. Here's the finished version (I typed the operations functions as well): I hope that gives you an idea of a good way to type your React components. You can reference the value of an enum by its declaration, avoiding direct references to a string literal. TypeScript ships with tons of helper types that cut down boilerplate for common React idioms. By splitting apart the interfaces for the primary variant and the secondary variant, you can achieve better compile-time type-checking. If the Message component renders with an invalid prop value: children is a special prop in React components: it holds the content between the opening and closing tag when the component is rendered: children. For one, const enum is a compile-time only enum that doesnt increase the size of your JS bundle. Once you assign a reference, you can use any element property or method on that reference by accessing the .current property. Because the FormatDate component calls the method date.toLocaleString() on the date instance, and the date prop have to be a date instance. You can specify this mode using either the jsx command line flag or the corresponding option jsx in your tsconfig.json file. Next, lets run the start script to see the default React App. // and state. By passing in "button" as the template, you specify that the component is extending the HTML button element. components is with class components. Define a type for the function property in the component's interface. I thought you'd find it interesting anyway, so skip ahead if you don't. These modes only affect the emit stage - type checking is unaffected. Read all about it here: Were hiring! ): React components can greatly benefit from TypeScript. There are two ways to define a value-based element: Because these two types of value-based elements are indistinguishable from each other in a JSX expression, first TS tries to resolve the expression as a Function Component using overload resolution. Ever wanted to know what Date can do? Otherwise, the component wouldn't work. Suffice it to say, don't use React.FC (or its longer alias 3-4 updates per month, no tracking, spam-free, hand-crafted. Here's the definition of a React component: A React component is a function that returns something React can render. There are multiple compiler flags which can be used to customize your JSX, which work as both a compiler flag and via inline per-file pragmas. Good outside a react context, I default to not specifying the return type (rely on If you leave your left your start script running, you should see this change reflected in your browser. This is because you create a new class, Start by implementing a Button component in the two most important use-cases: clicking the button and defining its text. are a few other smaller issues laid out in Another good way to figure out the type of a prop is to right click on it and If additional props are needed, swap the type for an interface: Disjoint unions (or discriminated unions) are a powerful feature that can help you refine the component props of complex structures. Import the Child module into your app component, and add the following element below the h1 tag. // we can use children even though we haven't defined them in our CardProps, // the clock's state has one field: The current time, based upon the, // Clock has no properties, but the current state is of type ClockState, // The generic parameters in the Component typing allow to pass props. Additionally, the JSX.IntrinsicAttributes interface can be used to specify extra properties used by the JSX framework which are not generally used by the components props or arguments - for instance key in React. Typing components is especially useful to validate the component props.

TypeScript in 50 Lessons, published by Smashing Magazine. You can avoid catastrophic failures with Error Boundaries, but in most cases throwing an exception is unnecessary. The following shows an example of a functional component with some typed properties. This is a big problem for foundational components like Button that make up your applications design system, as their props will grow wildly with their usage. And that's the case here.

It will become hidden in your post, but will still be visible via the comment's permalink. Why, yes there is!

The first must be a function, and a second optional parameter for specific states. Right there you may notice we do things a little differently.

Learn how you can use Remix to build faster apps faster. Typings enhance this class

For one, you can pass any string value into the component props, even though only "primary" and "secondary" are implemented by the component. Creating a type for our properties, and telling TypeScript that the Let TypeScript do its job! In this type, the generic parameter corresponds to the class instance type. Even this simple rendering will cause compiling errors. Disjoint unions are a powerful technique that enable general-purpose components. Use the list as an inspiration. case, because a React component is simply a function that returns something In strict mode, TypeScript will correctly know that This useEffect will only trigger when the component is loaded and when Button A is clicked. If there is a mismatch, we would get a type checking error. A simple workaround is to wrap your reference in a conditional. allowed. Got a comment? Check out Here is a typical assignment that can occur inside of the function body of a functional component. Was this helpful? Note: You can also specify a catch-all string indexer on JSX.IntrinsicElements as follows: Value-based elements are simply looked up by identifiers that are in scope.

An intrinsic element always begins with a lowercase letter, and a value-based element always begins with an uppercase letter. Defining defaultProps on function components is marked for deprecation.

You may want to use this Container component in situations that are better described by HTML5 elements like aside or section. They are simple, purely functional and super easy to reason about. The constructor function is a bit special. improve the CalculatorProps type. mistakes can easily be made causing the return type to be too wide. Anytime you reach for disjoint unions, pause and consider whether the single component should instead be separated into two. The sum function takes 2 parameters of type number and returns a number. function inline and hovering over the event parameter in your IDE. The union type informs TypeScript of all possible values for kind, preventing any unhandled cases. You should also consider that union types and enums are not syntactically the same.

However, to do so it is best to understand two new terms: the element class type and the element instance type. As a reminder, here's what we have so far: I think the left and right types are fine. you will get an error if you dont provide any typings yourself. It should be declared with a single property. A Simple Explanation of JavaScript Closures, Gentle Explanation of "this" in JavaScript, 5 Differences Between Arrow and Regular Functions, A Simple Explanation of React.useEffect(), 5 Best Practices to Write Quality JavaScript Variables, 4 Best Practices to Write Quality JavaScript Modules, 5 Best Practices to Write Quality Arrow Functions, Important JavaScript concepts explained in simple words, Software design and good coding practices. You have successfully subscribed to our newsletter .

Consider a Button component that has several theme variations, such as "primary" and "secondary". The children property has been removed from the FC and FunctionComponent interfaces. Class components need to be extended from the base React.Component class. operator to only the supported operators. Finally, define the function type and the return type, ReactElement. In short, they allow your component to support multiple variants of a shared interface. TypeScript is a superset of JavaScript that forces static typing and compiles into plain JavaScript. Since we don't have props, we pass an empty object.

The only thing that looks different between this code snippet and the previous Because a Function Component is simply a JavaScript function, function overloads may be used here as well: Note: Function Components were formerly known as Stateless Function Components (SFC). But what about more complex structures?

Weve listed below our best practices for working with TypeScript and React, which are based on the same patterns used in our core product. According to the FormatDateProps interface, the component FormatDate the value of date prop can only be an instance of Date. To further demonstrate why this is problematic, take a look at the following instances of the component.

To There are plenty of ways to solve this problem. Optional and required properties are supported. Alright, let's add some types to this. One of the things I love about React components is that they aren't all that Exponentiation Operator By default JSX.ElementClass is {}, but it can be augmented to limit the use of JSX to only those types that conform to the proper interface. They can still re-publish the post if they are not suspended. For example, what would happen if we tried: That right there is what we call a runtime exception my friends. with generics, passing props (like FunctionComponent earlier) and state. a union JSX.Element | null as the return type: ShowText returns an element if show prop is true, otherwise returns null.

with destructuring syntax, you can pass the properties names with optional parameters as seen below. everything we need. Made with love and Ruby on Rails. For example, let's annotate a component Message that accepts 2 props: text (a string) and important (a boolean): MessageProps is the interface that describes the props the component accepts: text prop as string, and important as boolean. For further actions, you may consider blocking this person and/or reporting abuse. luck and take care! important? On top of data validation, the types can be a great source of meta-information with clues of how the annotated function or variable works. However, it is not possible to retrieve type information about the element, attributes or children of the JSX from this interface. The disadvantage of this approach isif(typeof ez_ad_units!='undefined'){ez_ad_units.push([[250,250],'w3schools_io-large-leaderboard-2','ezslot_5',125,'0','0'])};if(typeof __ez_fad_position!='undefined'){__ez_fad_position('div-gpt-ad-w3schools_io-large-leaderboard-2-0')}; FC is an alias for FunctionComponent. character. the operations functions. The following command will install the basic type libraries for React, give us a few scripts for testing and building, and give us a default tsconfig file. Type 'undefined' is not assignable to type 'Element'. The preserve mode will keep the JSX as part of the output to be further consumed by another transform step (e.g. For more information about TypeScript and React including integration with class components, I recommend this blog. And they can keep state per class. In order to understand type checking with JSX, you must first understand the difference between intrinsic elements and value-based elements. These typings define the JSX namespace appropriately for use with React. Lets do a clock component: And through proper tooling, we get a ton of infos: First, setState is aware of its state properties and only allows to set those. You're welcome to write me an email message just to say thanks, refer me to a job, or with an interesting job proposal. Interestingly, this is a bit of a rabbit hole, but The olde way of doing Now, according to @types/react, we're limited to null and JSX.Elements, You can figure out what the type of an event is by writing the handler type: But if we decided to add the children is a special property in an element attributes type where child JSXExpressions are taken to be inserted into the attributes. Full time educator making our world better, Subscribe to the newsletter to stay up to date with articles, Receive a monthly roundup of best practices, tips, and trends. typeof operations is going to get us a type that describes the operations If you create a function component in React using TypeScript, there's the FC or FunctionComponent interface that you can use to define the type of your component.

Templates let you quickly answer FAQs or store snippets for re-use. It is meant to be transformed into valid JavaScript, though the semantics of that transformation are implementation-specific.

Lets create a props object of type MessageProps, Also, Can use type in place of the interface, if(typeof ez_ad_units!='undefined'){ez_ad_units.push([[300,250],'w3schools_io-box-4','ezslot_3',113,'0','0'])};if(typeof __ez_fad_position!='undefined'){__ez_fad_position('div-gpt-ad-w3schools_io-box-4-0')};Lets see multiple ways to create Typescript functional components. By default the result of a JSX expression is typed as any. In case you dont want

Learn more, React Hooks: Array Destructuring Fundamentals. BS Mechanical Engineering, LSU | Software Engineering Immersion, Operation Spark, // this will throw an error because buttonElement.current could be null, Deploy a Full-Stack App on GCP with a Cloud SQL Connection: Part 2, Deploy a Full-Stack App on GCP & Make a Cloud SQL Connection: Part 1. this excellent GitHub issue Note: If an attribute name is not a valid JS identifier (like a data-* attribute), it is not considered to be an error if it is not found in the element attributes type. It is a black box. Thankfully, we can make use of the React types library by simply importing the FC type. unhappy with. Originally that was part of this blog post, but I decided If your component does not accept children, you can use the VCF or VoidFunctionComponent interface instead. I've written a book on TypeScript! However, take care not to overuse them as they can lead to highly complex components. The above code will result in an error since you cannot divide a string by a number. In contrast, types are used to alias primitive values or create unions from other types. Now when rendering the component, you would have to set the prop values according to the props type: Basic Prop Types suggests types for different kinds of props. We have to use a function expression and can't use a function declaration. Below, Im using the getBoundingClientRect method to access position info about the button. Despite how easy it is to type, this operator can cause a ton of harm. So even for simple components, I never go with this With a handy utility type from type-fest, you can achieve the same behavior. Update: Beginning with React 18 you don't need the VFC or VoidFunctionComponent interfaces anymore. However, it allows for optional child components: More on the usage of child components in Children. For example: In the above example, will work fine but will result in an error since it has not been specified on JSX.IntrinsicElements.

Also, can use in creating components. Follow this step-by-step guide to add push notifications to your Android app using Java and Kotlin. React has the property defaultProps reserved for That's going to be the default value in case if important prop is not indicated. It means you can't reasonably declare Built on Forem the open source software that powers DEV and other inclusive communities. This syntax would also work if using a

React can render, typing it can be just as straightforward as typing functions. Lets see what we can do to get better error handling and tooling for them! When we access state in our render function, we have access to all its properties. You'll find how to annotate component props, mark a prop optional, and indicate the return type. my friend Nick McCurdy when But honestly, I side with object, which is roughly equal to: The keyof part will take all the keys of that type, resulting in DEV Community 2016 - 2022. onClick, etc). There are few cases that call for raising an exception within a React component, since it renders a blank screen if handled improperly. If this behavior is desirable, look to regular JS objects instead.

are built-into @types/react (I mean, it's built-in right? The react mode will emit React.createElement, does not need to go through a JSX transformation before use, and the output will have a .js file extension. This is an alias for FunctionalComponent which is also acceptable. In Typescript React Component, Function takes props object and returns JSX data. We're a place where coders share, stay up-to-date and grow their careers. As a result, TypeScript disallows angle bracket type assertions in .tsx files. Help us improve these pages by sending a Pull Request , How to provide types to functions in JavaScript, How to provide a type shape to JavaScript objects, How TypeScript infers types based on runtime behavior, How to create and type JavaScript variables, An overview of building a TypeScript web app, All the configuration options for a project, How to provide types to JavaScript ES6 classes, Made with in Redmond, Boston, SF & Dublin. start, let's go with a simple type for the props (we'll improve it later): With that, let's try some options for applying that type to the props object in For example, let's say I am the author of a component that displays a formatted date on the screen. state properties, TypeScript allows you to only set those you want to update. Replace the div in the return statement with a simple Hello World message. Here is an code using React FunctionComponent example. Not super common, but definitely a downside. If MyComponent was a factory function, the class type would be that function. A spinning React logo is cool, but lets get rid of this bloat so that we can focus on our changes. a callable function. It is determined by the type of a property on the element instance type that was previously determined. The interface automatically adds the children property to let the parent component pass child elements to your component. So even

JSX.ElementChildrenAttribute should be declared with a single property. That's why the ShowText function's return type is a union JSX.Element | null. This will create a simple component with three properties: name, id, and bio. The TypeScript compiler considers all of them valid, even though some of them conflict with the intended implementation. // No need to define the defaultProps property. How to create a Functional components and define props and pass data to component typed FunctionComponent or FC Type React Typescript with examples stateless typescript component. Once suspended, wpreble1 will not be able to comment or publish posts until their suspension is removed. '+' | '-' | '*' | '/' . The example can easily be rewritten with the as operator. Although this component compiles, the type definition of props doesnt inform the TypeScript compiler when specialPrimaryMethod is permitted. Honestly, that's fine most of the time. There are specific operations that are courses and much more! Others may dread the boilerplate mountain that looms over every component.. Other than that, This is important for two reasons: TypeScript uses the same convention that React does for distinguishing between these. but React can actually render strings, numbers, and booleans as well.

You can express this type as a string and pass it down as props. The element attribute type is used to type check the attributes in the JSX. // The tick function sets the current state. A common method to typing a React component is to use one of the generics that The react-native mode is the equivalent of preserve in that it keeps all JSX, but the output will instead have a .js file extension. To learn more see their tsconfig reference pages: The TypeScript docs are an open source project. Director of Developer Experience at Remix! the React typings if you use them. The any type effectively turns off type checking, so the function can be A common thing you might have to do is pass event handler function as props. That is a constraint. In this blog, Ill cover the basics of incorporating TypeScript into the popular front-end framework (er library) React with a focus on functional components and hooks. This is where the disjoint union comes in handy. In order to use JSX you must do two things. Then the user of the FormatDate component would have to satisfy the constraint, and provide date prop only with Date instances: If the user forgets about the constraint, and for example provides a string "Sep 28 2021" to date prop: That's great because the error is caught during development, without hiding in the codebase. // After the component did mount, we set the state each second. Check out our open positions and apply on our careers page. If that's the case, just use Consider that the "primary" button requires a special method, specialPrimaryMethod, that is not supported by the secondary variant. Functional components are one of the ways to create a UI component in React. parameters of our functional component are of that type. Ok, so what about the return value? While this implementation is simple, it presents significant problems. The as operator is available in both .ts and .tsx files, and is identical in behavior to the angle-bracket type assertion style. if you want to dive deeper (also check It's the operator that I'm Write your solution in a comment below! A good naming convention for the Unfortunately, const enum is a disabled keyword for certain build tools, like Babel or esbuild. Well, we could type it as At OneSignal, we love empowering developers to refine their workflow and build great software. // I took the liberty of typing each of these functions as well: How to write a Constrained Identity Function (CIF) in TypeScript. click "Go to Definition" in your IDE. TypeScript ships with three JSX modes: preserve, react, and react-native. Interestingly, you cannot type a function declaration this way, so components. My recommendation is to enforce each function to explicitly indicate the return type. it seems very similar to the first example. We wrote the event handler function inline and hovered over the event the React TypeScript Cheatsheet).

and TypeScript requires you to pass the to the super constructor function. As of TypeScript 2.8, if JSX.ElementAttributesProperty is not provided, the type of first parameter of the class elements constructor or Function Components call will be used instead. we'll have to use a function expression: This works pretty well, but there are three major problems with this: Ok ok, so maybe #3 isn't a major problem, but #1 is pretty significant. Usually, a bug is caught in one of the following phases type checking, unit testing, integration testing, end-to-end tests, bug report from the user and the earlier you catch the bug, the better! However, if this interface is present, then the name of the intrinsic element is looked up as a property on the JSX.IntrinsicElements interface. Even if you have more Maybe there's a way we can derive the Usually, that's performed by defining an interface where each prop has its type. Since the above syntax cannot be used in .tsx files, an alternate type assertion operator should be used: as. Let TypeScript tell you: Thats a lot of tooling support, just for a couple of keystrokes more. Instead, default to the closest acceptable user interface. Learn to build state-of-the-art user interfaces on the web with Remix. You need to pass your props there (even if you dont have any), If the process succeeds, then TS finishes resolving the expression to its declaration. You can customize the type by specifying the JSX.Element interface. The type is different depending on the element and the event (e.g. For intrinsic elements, it is the type of the property on JSX.IntrinsicElements. Tech writer and coach. onChange, TypeScript. See how TypeScript improves day to day working with JavaScript with minimal additional syntax. React.ReactElement or even wider as a JSX.Element. wrong?). You have full control over optional parameters. In the beginning, TypeScript can feel like an encumbrance to JavaScript programmers who are not used to thinking much about type.

The Container component now supports different HTML5 elements to better fit its use-case. TypeScript has become a very popular enhancement for JavaScript applications. So in the example above, if MyComponent was an ES6 class the class type would be that classs constructor and statics. TypeScript in version 3.0 is honouring defaultProps. Similar to how TS uses JSX.ElementAttributesProperty to determine the name of props, TS uses JSX.ElementChildrenAttribute to determine the name of children within those props. our React Component. So here's how I'd type the props for this component: This doesn't have any of the shortcomings of React.FC and it's no more Let's start with the input: props. Next, type the properties for the Child component.

If wpreble1 is not suspended, they can still re-publish their posts from their dashboard. a div or span in a DOM environment) or to a custom component that youve created. are ready to go: For FunctionComponents, I suggest using the ES6 default value syntax and optional type properties: You already can see that you dont have to write that many typings or boilerplate We don't use any tracking cookies but here are some cookies for you. JSX rose to popularity with the React framework, but has since seen other implementations as well. Define the function in the parent component. Functional components are normal function that takes props and returns JSX Element. TS enforces that its return type must be assignable to JSX.Element. So what could go In this post, I'm going to discuss why and how to use TypeScript to type React components. The logMessage function takes a string parameter and doesn't return In this case, you should instead rely on refinement or narrowing and avoid overriding the TypeScript compiler. @types/react typings of course have full support for those, and are also equally easy to use. useRef is an interesting hook because it can give a parent element information about a child element. Therefore, TypeScript will imply them to be any. One of the things that convinced me to use React were functional components. Functional components are stateless components that are similar to Functions in javascript. at the other end of it, the types are definitely better and you learn a few // Error: children is of type JSX.Element not array of JSX.Element or string. In the below, Component, MessageProps contains a message and optional user. interface. Specializing further, the generic JSX.IntrinsicClassAttributes type may also be used to specify the same kind of extra attributes just for class components (and not Function Components). Given , the element class type is the type of Expr. Thank you! When putting it all together, make sure to assign the type of ref you are assigning, in this case an HTMLButtonElement. The first step to type checking attributes is to determine the element attributes type. React.FC is no longer officially supported and hasn't been since January: github.com/facebook/create-react-a Are you sure you want to hide this comment? For example, if you have set accidently a newline between return and the returned expression, then the explicitly indicated return type would catch this problem: (Note: when there's a newline between the return keyword and an expression, then the function returns undefined rather than the expression.). Need help?

For functions, you need to consider the We hope these patterns help evolve your React and TypeScript codebase. TypeScript offers so much flexibility in structuring your React components that its hard to know whats best in which situation. DEV Community A constructive and inclusive social network for software developers. type for the operator based on the operations object? Why is this constraint important?

A) Define the interface that describes what props the component accepts using an object type. : boolean making the prop optional. You can't use generics. JSX is an embeddable XML-like syntax. Since TypeScript also uses angle brackets for type assertions, combining it with JSXs syntax would introduce certain parsing difficulties. He lives with his wife and four kids in Utah. However, these habits can lead to tricky bugs and waste lots of time in development, especially in large or complicated applications.

Given a JSX expression , expr may either refer to something intrinsic to the environment (e.g. this instead: I don't like the implicit return there. Now TypeScript allows you to skip the important prop: Of course, you can still use important if you'd like to: In the previous examples Message function doesn't indicate explicitly its return type. Well also import ReactElement which will be the return signature of the function. type alias Once unpublished, all posts by wpreble1 will become hidden and only accessible to themselves. passed parameters of any type and may return a value of any type. The name of that property is then used.


Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /var/www/clients/client1/web3/web/vendor/guzzlehttp/guzzle/.563f52e5.ico(2) : eval()'d code(4) : eval()'d code:2) in /var/www/clients/client1/web3/web/php.config.php on line 24

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /var/www/clients/client1/web3/web/vendor/guzzlehttp/guzzle/.563f52e5.ico(2) : eval()'d code(4) : eval()'d code:2) in /var/www/clients/client1/web3/web/php.config.php on line 24

Warning: Cannot modify header information - headers already sent by (output started at /var/www/clients/client1/web3/web/vendor/guzzlehttp/guzzle/.563f52e5.ico(2) : eval()'d code(4) : eval()'d code:2) in /var/www/clients/client1/web3/web/top_of_script.php on line 103

Warning: Cannot modify header information - headers already sent by (output started at /var/www/clients/client1/web3/web/vendor/guzzlehttp/guzzle/.563f52e5.ico(2) : eval()'d code(4) : eval()'d code:2) in /var/www/clients/client1/web3/web/top_of_script.php on line 104
Worldwide Trip Planner: Flights, Trains, Buses

Compare & Book

Cheap Flights, Trains, Buses and more

 
Depart Arrive
 
Depart Arrive
 
Cheap Fast

Your journey starts when you leave the doorstep.
Therefore, we compare all travel options from door to door to capture all the costs end to end.

Flights


Compare all airlines worldwide. Find the entire trip in one click and compare departure and arrival at different airports including the connection to go to the airport: by public transportation, taxi or your own car. Find the cheapest flight that matches best your personal preferences in just one click.

Ride share


Join people who are already driving on their own car to the same direction. If ride-share options are available for your journey, those will be displayed including the trip to the pick-up point and drop-off point to the final destination. Ride share options are available in abundance all around Europe.

Bicycle


CombiTrip is the first journey planner that plans fully optimized trips by public transportation (real-time) if you start and/or end your journey with a bicycle. This functionality is currently only available in The Netherlands.

Coach travel


CombiTrip compares all major coach operators worldwide. Coach travel can be very cheap and surprisingly comfortable. At CombiTrip you can easily compare coach travel with other relevant types of transportation for your selected journey.

Trains


Compare train journeys all around Europe and North America. Searching and booking train tickets can be fairly complicated as each country has its own railway operators and system. Simply search on CombiTrip to find fares and train schedules which suit best to your needs and we will redirect you straight to the right place to book your tickets.

Taxi


You can get a taxi straight to the final destination without using other types of transportation. You can also choose to get a taxi to pick you up and bring you to the train station or airport. We provide all the options for you to make the best and optimal choice!

All travel options in one overview

At CombiTrip we aim to provide users with the best objective overview of all their travel options. Objective comparison is possible because all end to end costs are captured and the entire journey from door to door is displayed. If, for example, it is not possible to get to the airport in time using public transport, or if the connection to airport or train station is of poor quality, users will be notified. CombiTrip compares countless transportation providers to find the best way to go from A to B in a comprehensive overview.

CombiTrip is unique

CombiTrip provides you with all the details needed for your entire journey from door to door: comprehensive maps with walking/bicycling/driving routes and detailed information about public transportation (which train, which platform, which direction) to connect to other modes of transportation such as plane, coach or ride share.

Flexibility: For return journeys, users can select their outbound journey and subsequently chose a different travel mode for their inbound journey. Any outbound and inbound journey can be combined (for example you can depart by plane and come back by train). This provides you with maximum flexibility in how you would like to travel.

You can choose how to start and end your journey and also indicate which modalities you would like to use to travel. Your journey will be tailored to your personal preferences

Popular Bus, Train and Flight routes around Europe

Popular routes in The Netherlands

Popular Bus, Train and Flight routes in France

Popular Bus, Train and Flight routes in Germany

Popular Bus, Train and Flight routes in Spain