,
,unknown
typescript
3 years ago
1.5 kB
6
Indexable
interface Todo { title: string description: string completed: boolean } type MyOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> type TodoPreview = MyOmit<Todo, 'description' | 'title'> const todo: TodoPreview = { completed: false, } //2 type arr1 = ['a', 'b', 'c'] type arr2 = [3, 2, 1] type First<T extends unknown[]> = T[0] type head1 = First<arr1> // expected to be 'a' type head2 = First<arr2> // expected to be 3 // 3 type Todo = { title: string description: string completed: boolean } type MyReadonly2<T, K extends keyof T> = Readonly<Pick<T, K>> & Omit<T, K> const todo: MyReadonly2<Todo, 'title' | 'description'> = { title: "Hey", description: "foobar", completed: false, } todo.title = "Hello" // Error: cannot reassign a readonly property todo.description = "barFoo" // Error: cannot reassign a readonly property todo.completed = true // OK // 4 type X = { x: { a: 1 b: 'hi' z: string } y: string } type Expected = { readonly x: { readonly a: 1 readonly b: 'hi' } readonly y: 'hey' } type DeepReadonly<T> = Readonly<{ [key in keyof T]: Readonly<T[key]> }> type Todo = DeepReadonly<X> // should be same as `Expected` const test: Todo = { x: { a: 1, b: 'hi', z: 'try change me too', }, y: 'try change me', }; test.y = 'changed'; // Error test.x.b = 'changed'; // Error
Editor is loading...