NonNullable 不适用于通用 属性

NonNullable does not work on Generic property

我尝试创建使特定键不可为空的类型。

我的 IDE (WebStorm) 在我尝试访问 属性 时说 属性 是不可空的,但是在将值分配给常量时,WebStorm 说该值是不可为空。

我的代码有什么问题?

我的代码:

interface NullableA {
    a?: number;
}

export type EnsureKeyExists<T, K extends keyof T> = T & {
    [P in K]: NonNullable<T[P]>;
};

const a: EnsureKeyExists<NullableA, 'a'> = { a: 2 };

const nonNullNumber: number = a.a // => this is error

属性 似乎不是可空类型

赋值时,值可以为空

这是我的 tsconfig.json 文件:

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": false,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "strictNullChecks": true,
    "noImplicitAny": true,
    "strictFunctionTypes": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true
  }
}

其他信息:

我用-?解决了它:

export type EnsureKeyExists<T, K extends keyof T> = T & {
    [P in K]-?: T[P];
};

请参阅此 PR 进一步参考。

使用 Required 也可以:

export type EnsureKeyExists<T, K extends keyof T> = T & Required<{
    [P in K]: T[P];
}>;