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
}
}
其他信息:
- WebStorm 版本为 2021.3.2
我用-?
解决了它:
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];
}>;
我尝试创建使特定键不可为空的类型。
我的 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
}
}
其他信息:
- WebStorm 版本为 2021.3.2
我用-?
解决了它:
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];
}>;