[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Types](https://evolu.dev/docs/api-reference/common/Types) › IsSameType

```ts
type IsSameType<A, B> = <T>() => T extends (A & T) | T
  ? true
  : false extends <T>() => T extends (B & T) | T ? true : false
    ? [A] extends [never]
      ? [B] extends [never]
        ? true
        : false
      : [B] extends [never]
        ? false
        : true
    : false;
```

Defined in: [packages/common/src/Types.ts:443](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Types.ts#L443)

Returns whether two types are identical according to TypeScript.

Unlike mutual assignability, this distinguishes narrower literals, `any`,
`unknown`, `never`, optional properties, and readonly properties.
Intersection types are not normalized; apply [Simplify](https://evolu.dev/docs/api-reference/common/Types/type-aliases/Simplify) explicitly when
normalization is part of the intended comparison.

### Exact type equality

```ts

assertType<
  true,
  IsSameType<{ readonly id: string }, { readonly id: string }>
>();
assertType<false, IsSameType<"ready", string>>();
```