我需要创建一个排除某些文字类型并接受所有其他字符串的类型.我试过这个:

type ExcludedKeys = "a"|"b"

type MyType = {
    [K in Exclude<string,ExcludedKeys>]: any
}

const obj: MyType = {
    a: 0, // No Error
    b: 1 // No Error
}

但很快我发现Exclude<string,ExcludedKeys>只是string,用这种方法是不可能的.然后,我try 了这种方法:

type ExcludedKeys = "a"|"b"

type MyType<T> = keyof T extends ExcludedKeys ? never : {
    [K in keyof T]: T[K]
} 

declare class Obj {
    a: number
    b: number
    c: number // Adding this removes the wanted error.
}

const obj: MyType<Obj> = {
    a: 0, // No Error
    b: 1, // No Error
    c: 3
}

但只有当ExcludedKeys人的成员是该对象的唯一props 时,这才有效.

TS Playground link

我需要的是

如上所述,否定可分配给一组字符串的属性名的类型

type ExcludedKeys = "a"|"b"

const obj = {
    a: 0, // Error Here
    b: 1, // Error Here
    c: 3
}

编辑

尽管我没有提到它是为了简化上下文,但正如jsejcksn's answer指出的那样,我需要这个类型来保存给定类模型的类型信息.尽管如此,lepsch's answer仍然是被接受的,因为它以最短和最简单的方式完成了我所要求的事情.无论如何,我想分享我是如何改变这种方法以满足我的需求的.

type ExcludedKeys = "a"|"b"

type MyType<T> = {
    [K in keyof T]: T[K]
} & {
    [K in ExcludedKeys]?: never
}

Playground link

推荐答案

你就快到了.试试这个:

type ExcludedKeys = "a"|"b"

type MyType1 = {
    [key: string]: any
} & {
    [K in ExcludedKeys]: never
}

const obj1: MyType1 = {
    a: 0, // Error
    b: 1, // Error
    c: 3, // No Error
}

Typescript相关问答推荐

如何在类型脚本中声明对象其键名称不同但类型相同?

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

在这种情况下,如何获得类型安全函数的返回值?

如何在排版中正确键入中间件链和控制器链

在动态对话框中使用STEP组件实现布线

匿名静态类推断组成不正确推断

如何重构长联合类型?

接口中函数的条件参数

角效用函数的类型推断

在Typescript 中,有没有`index=unfined的速记?未定义:某个数组[索引]`?

错误TS2403:后续变量声明必须具有相同的类型.变量';CRYPTO';的类型必须是';CRYPATO';,但这里的类型是';CRYPATO';

使用动态输出类型和泛型可重用接口提取对象属性

创建Angular 为17的动态形状时出错

ANGLE NumberValueAccessor表单控件值更改订阅两次

界面中数组中的混合类型导致打字错误

有没有办法在Reaction组件中动态导入打字脚本`type`?

为什么受歧视的unions 在一种情况下运作良好,但在另一种非常类似的情况下却不起作用?

组件使用forwardRef类型脚本时传递props

如何在TypeScript中将元组与泛型一起使用?

两个接口的TypeScript并集,其中一个是可选的