gpt4 book ai didi

typescript :具有排除更改属性修饰符的映射类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:29 25 4
gpt4 key购买 nike

当使用 Minus 映射类型时,它似乎从属性中删除修饰符。我认为这是由 Exclude 类型引起的,但我不确定为什么。

我希望 Minus 只是从 T 中删除 U 的键而不更改 T 的属性修饰符。

type Minus<T, U> = { [P in Exclude<keyof T, keyof U>]: T[P] }
type Noop<T> = { [P in keyof T]: T[P] }

interface Student {
readonly gpa: number
hobby?: string
name: string
}

interface Person {
name: string
}

type Difference = Minus<Student, Person>
// type Difference = {
// gpa: number; <-- Where did readonly go?
// hobby: string | undefined; <-- Why is it no longer optional? It seems to have picked up '| undefined' though...
// }

const test1: Difference = { gpa: 4 } // <-- Error: property 'hobby' is missing

type NoopType = Noop<Student>
// type StringsOnly = {
// readonly gpa: number;
// hobby?: string | undefined;
// name: string;
// }

const test2: NoopType = { gpa: 4, name: "bob" } // OK

最佳答案

Typescript 将保留同态映射类型的修饰符,如 here 所述, 但基本思想是,如果类型具有 { [P in keyof T]: T[P] } 形式,则保留修饰符或类似的东西。在您的情况下,编译器无法将映射类型识别为同态,因为 Exclude<keyof T, keyof U>而且我很确定此限制已记录在某处,但我目前无法找到它。解决这个问题的简单方法是通过 Pick 使用额外的间接寻址。例如:+

type Minus<T, U> = Pick<T, Exclude<keyof T, keyof U>>

关于 typescript :具有排除更改属性修饰符的映射类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51580825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com