-
-
Notifications
You must be signed in to change notification settings - Fork 502
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
73 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,40 +1,5 @@ | ||
import type {Except} from './except'; | ||
import type {Simplify} from './simplify'; | ||
import type {Writable} from './writable'; | ||
|
||
/** | ||
Create a type that strips `readonly` from all or some of an object's keys. Inverse of `Readonly<T>`. | ||
This can be used to [store and mutate options within a class](https://github.com/sindresorhus/pageres/blob/4a5d05fca19a5fbd2f53842cbf3eb7b1b63bddd2/source/index.ts#L72), [edit `readonly` objects within tests](https://stackoverflow.com/questions/50703834), [construct a `readonly` object within a function](https://github.com/Microsoft/TypeScript/issues/24509), or to define a single model where the only thing that changes is whether or not some of the keys are mutable. | ||
@example | ||
``` | ||
import type {Mutable} from 'type-fest'; | ||
type Foo = { | ||
readonly a: number; | ||
readonly b: readonly string[]; // To show that only the mutability status of the properties, not their values, are affected. | ||
readonly c: boolean; | ||
}; | ||
const mutableFoo: Mutable<Foo> = {a: 1, b: ['2'], c: true}; | ||
mutableFoo.a = 3; | ||
mutableFoo.b[0] = 'new value'; // Will still fail as the value of property "b" is still a readonly type. | ||
mutableFoo.b = ['something']; // Will work as the "b" property itself is no longer readonly. | ||
type SomeMutable = Mutable<Foo, 'b' | 'c'>; | ||
// type SomeMutable = { | ||
// readonly a: number; | ||
// b: readonly string[]; // It's now mutable. The type of the property remains unaffected. | ||
// c: boolean; // It's now mutable. | ||
// } | ||
``` | ||
@category Object | ||
*/ | ||
/** @deprecated @see Writable */ | ||
export type Mutable<BaseType, Keys extends keyof BaseType = keyof BaseType> = | ||
Simplify< | ||
// Pick just the keys that are not mutable from the base type. | ||
Except<BaseType, Keys> & | ||
// Pick the keys that should be mutable from the base type and make them mutable by removing the `readonly` modifier from the key. | ||
{-readonly [KeyType in keyof Pick<BaseType, Keys>]: Pick<BaseType, Keys>[KeyType]} | ||
>; | ||
Writable<BaseType, Keys>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import type {Except} from './except'; | ||
import type {Simplify} from './simplify'; | ||
|
||
/** | ||
Create a type that strips `readonly` from all or some of an object's keys. Inverse of `Readonly<T>`. | ||
This can be used to [store and mutate options within a class](https://github.com/sindresorhus/pageres/blob/4a5d05fca19a5fbd2f53842cbf3eb7b1b63bddd2/source/index.ts#L72), [edit `readonly` objects within tests](https://stackoverflow.com/questions/50703834), [construct a `readonly` object within a function](https://github.com/Microsoft/TypeScript/issues/24509), or to define a single model where the only thing that changes is whether or not some of the keys are writable. | ||
@example | ||
``` | ||
import type {Writable} from 'type-fest'; | ||
type Foo = { | ||
readonly a: number; | ||
readonly b: readonly string[]; // To show that only the mutability status of the properties, not their values, are affected. | ||
readonly c: boolean; | ||
}; | ||
const writableFoo: Writable<Foo> = {a: 1, b: ['2'], c: true}; | ||
writableFoo.a = 3; | ||
writableFoo.b[0] = 'new value'; // Will still fail as the value of property "b" is still a readonly type. | ||
writableFoo.b = ['something']; // Will work as the "b" property itself is no longer readonly. | ||
type SomeWritable = Writable<Foo, 'b' | 'c'>; | ||
// type SomeWritable = { | ||
// readonly a: number; | ||
// b: readonly string[]; // It's now writable. The type of the property remains unaffected. | ||
// c: boolean; // It's now writable. | ||
// } | ||
``` | ||
@category Object | ||
*/ | ||
export type Writable<BaseType, Keys extends keyof BaseType = keyof BaseType> = | ||
Simplify< | ||
// Pick just the keys that are not writable from the base type. | ||
Except<BaseType, Keys> & | ||
// Pick the keys that should be writable from the base type and make them writable by removing the `readonly` modifier from the key. | ||
{-readonly [KeyType in keyof Pick<BaseType, Keys>]: Pick<BaseType, Keys>[KeyType]} | ||
>; |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import {expectType, expectError} from 'tsd'; | ||
import type {Writable} from '../index'; | ||
|
||
type Foo = { | ||
readonly a: number; | ||
readonly b: string; | ||
}; | ||
|
||
const ab: Writable<Foo> = {a: 1, b: '2'}; | ||
ab.a = 2; | ||
const ab2: Writable<Readonly<Foo>> = ab; | ||
ab2.a = 2; | ||
|
||
// Update one writable and one readonly to writable, leaving one property unaffected. | ||
declare const variation1: Writable<{readonly a: number; b: string; readonly c: boolean}, 'b' | 'c'>; | ||
expectType<{readonly a: number; b: string; c: boolean}>(variation1); | ||
|
||
// Update two readonly to writable, leaving one property unaffected. | ||
declare const variation2: Writable<{readonly a: number; readonly b: string; readonly c: boolean}, 'a' | 'b'>; | ||
expectType<{a: number; b: string; readonly c: boolean}>(variation2); | ||
|
||
// Three writable remain writable. | ||
declare const variation3: Writable<{a: number; b: string; c: boolean}, 'a' | 'b' | 'c'>; | ||
expectType<{a: number; b: string; c: boolean}>(variation3); | ||
|
||
// Check if type changes raise an error even if readonly and writable are applied correctly. | ||
declare const variation4: Writable<{readonly a: number; b: string; readonly c: boolean}, 'b' | 'c'>; | ||
expectError<{readonly a: boolean; b: string; c: boolean}>(variation4); |