# Composition API:
Dependency Injection {#composition-api-dependency-injection}
## provide() {#provide}
Provides a value that can be injected by descendant components.
- **Type**
```ts
function provide(key: InjectionKey | string, value: T): void
```
- **Details**
`provide()` takes two arguments: the key, which can be a string or a symbol, and the value to be injected.
When using TypeScript, the key can be a symbol casted as `InjectionKey` - a Vue provided utility type that extends `Symbol`, which can be used to sync the value type between `provide()` and `inject()`.
Similar to lifecycle hook registration APIs, `provide()` must be called synchronously during a component's `setup()` phase.
- **Example**
```vue
```
- **See also**:
- [Guide - Provide / Inject](/guide/components/provide-inject.html)
- [Guide - Typing Provide / Inject](/guide/typescript/composition-api.html#typing-provide-inject)
## inject() {#inject}
Injects a value provided by an ancestor component or the application (via `app.provide()`).
- **Type**
```ts
// without default value
function inject(key: InjectionKey | string): T | undefined
// with default value
function inject(key: InjectionKey | string, defaultValue: T): T
// with factory
function inject(
key: InjectionKey | string,
defaultValue: () => T,
treatDefaultAsFactory: true
): T
```
- **Details**
The first argument is the injection key. Vue will walk up the parent chain to locate a provided value with a matching key. If multiple components in the parent chain provides the same key, the one closest to the injecting component will "shadow" those higher up the chain. If no value with matching key was found, `inject()` returns `undefined` unless a default value is provided.
The second argument is optional and is the default value to be used when no matching value was found. It can also be a factory function to return values that are expensive to create. If the default value is a function, then `false` must be passed as the third argument to indicate that the function should be used as the value instead of the factory.
Similar to lifecycle hook registration APIs, `inject()` must be called synchronously during a component's `setup()` phase.
When using TypeScript, the key can be of type of `InjectionKey` - a Vue-provided utility type that extends `Symbol`, which can be used to sync the value type between `provide()` and `inject()`.
- **Example**
Assuming a parent component has provided values as shown in the previous `provide()` example:
```vue
```
- **See also**:
- [Guide - Provide / Inject](/guide/components/provide-inject.html)
- [Guide - Typing Provide / Inject](/guide/typescript/composition-api.html#typing-provide-inject)