,

,
 avatar
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...