输入'string | 编号| 空| undefined'不能分配给'null'类型

吉安

我正在尝试在Typescript类中实现C#类对象初始化器但是编译器显示以下错误。

错误:键入“字符串| 编号| 空| undefined”不能分配给“ null”类型。错误:无法将类型“ undefined”分配给类型“ null”

下面是代码

type gender = 'Male' | 'female';

class Person {
    public name: string | null = null;
    public age: number | null = null;
    public gender: gender | null = null;

    constructor(
        param: Partial<Person>
    ) {
        if (param) {

            /**
             * Is key exist in Person
             * @param param key
             */
            const keyExists = (k: string): k is keyof Person => k in this;

            /**
             * Keys
             */
            const keys: string[] = Object.keys(param);

            keys.forEach((k: string) => {
                if (keyExists(k)) {
                    //k: "name" | "age" | "gender"

                    const value = param[k]; //value: string | number | null | undefined

                    //let a = this[k]; //a: string | number | null

                    this[k] = value; //error :  Type 'string | number | null | undefined' is not assignable to type 'null'.
                                    // Error :  Type 'undefined' is not assignable to type 'null'.
                }
            });

        }
    }

}

let a = new Person({
    age: 10
});

console.log(a);

下面是tsconfig.json

{
    "compilerOptions": {
      "target": "es5",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
      "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
      "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
      "strict": true,                           /* Enable all strict type-checking options. */
      "strictNullChecks": true,              /* Enable strict null checks. */
      "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */
      "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
    }
  }
特里

您的问题实际上有两个方面:

  1. paramPartial<Person>,因此它可能不包含所有存在的密钥。但是,该keyExists()方法仅会通知编译器中是否存在给定的密钥Person,因此您最终会得到param[key]return undefined
  2. 正如@VLAZ在注释中指出的那样,编译器无法智能地猜测(或缩小类型)value逐个密钥的基础。

解决方案可能不是最好的,但是可以使用的方法是:

  1. 您需要添加类型保护检查,如果param[k]未定义
  2. 您需要手动将类型this[k]转换为typeof value

即使我通常避免使用手动类型转换,在这种情况下,它还是非常合理和安全的,因为在转换时,您k必须使用该Person类型,因为它必须是该类的成员,因此您只是在暗示编译器“知道我正在使用哪种特定类型,不要惊慌”。

这样,Array.prototype.forEach回调内部的修改后的逻辑如下所示:

keys.forEach((k: string) => {
  if (keyExists(k)) {
    const value = param[k];

    if (value === void 0)
      return;

    (this[k] as typeof value) = value;
  }
});

TypeScript Playground上查看

我个人不喜欢嵌套if语句,因为它使代码真正难以阅读,因此您也可以重构以上代码以专门使用保护子句:

keys.forEach((k: string) => {
  if (!keyExists(k))
    return;

  const value = param[k];

  if (value === void 0)
    return;

  (this[k] as typeof value) = value;
});

请参见TypeScript Playground

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不能将空值分配给十进制类型的成员,该类型是非空值类型

来自分类Dev

输入类型编号返回null

来自分类Dev

允许空值-输入类型编号

来自分类Dev

递增输入类型编号

来自分类Dev

Angular Ivy类型检查:类型'SafeHtml'不能分配给类型'string'

来自分类Dev

类型'undefined'不能分配给'never'类型

来自分类Dev

输入'string | 数字”不能分配给“从不”类型

来自分类Dev

在TextArea中反应Typescript错误:类型'string'无法分配给类型编号

来自分类Dev

PHP类型属性批量声明不能将null分配给可为空的字段

来自分类Dev

类型'Observable <UI [] | 不能将Promise <any >>'分配给类型'Observable <UI []>'。输入'UI [] | Promise <any>'不能分配给类型'UI []'

来自分类Dev

类型'false'不能分配给类型'(((status:number)=> boolean)| undefined'TypeScript

来自分类Dev

输入“元素| undefined'不能分配给'ReactElement <any,string | ((道具:任何)

来自分类Dev

类型'HTMLElement |的参数 “ null”不可分配给“ Element”类型的参数。类型'null'不能分配给类型'Element'.ts(2345)

来自分类Dev

如何配置TypeScript来避免:类型'string'不能分配给类型'“ desc” | “ asc” | undefined'.ts(2322)?

来自分类Dev

输入'string | 不能将null分配给类型'string | TypeScript未定义的错误

来自分类Dev

JSX元素类型'ReactElement <any>不是JSX元素的构造函数。类型'undefined'不能分配给类型'Element | 空值'

来自分类Dev

枚举类型的对象键-不能分配给'string | 编号| 符号'

来自分类Dev

类型'HTMLCanvasElement |的参数 不能将'null'分配给类型的参数

来自分类Dev

Typescript-如何解决“类型'undefined'不能分配给类型'XXXX'”的问题?

来自分类Dev

键入“ Observable <用户| 空| undefined>'不能分配给类型'Observable <User>'

来自分类Dev

键入“ Observable <用户| 空| undefined>'不能分配给类型'Observable <User>'

来自分类Dev

TypeScript-类型'String'的参数不能分配给类型'string'的参数

来自分类Dev

使用Angular Route Guard时:'Observable <true | undefined>'不能分配给类型>'Observable <boolean>'

来自分类Dev

Typescript-无法将“ undefined”类型分配给“ string | type” 编号| 符号'

来自分类Dev

TS2322:输入'Todo [] | “ null”不可分配给“ Todo []”类型。类型“ null”不可分配给类型“ Todo []”

来自分类Dev

递增输入类型编号

来自分类Dev

类型 'string' 不能分配给类型 '"foo"'

来自分类Dev

“Params”类型的参数不能分配给“string”类型的参数

来自分类Dev

输入 '(token: string) => Observable<{ headers: HttpHe aders; }>' 不可分配给类型 'Observable<any>'

Related 相关文章

  1. 1

    不能将空值分配给十进制类型的成员,该类型是非空值类型

  2. 2

    输入类型编号返回null

  3. 3

    允许空值-输入类型编号

  4. 4

    递增输入类型编号

  5. 5

    Angular Ivy类型检查:类型'SafeHtml'不能分配给类型'string'

  6. 6

    类型'undefined'不能分配给'never'类型

  7. 7

    输入'string | 数字”不能分配给“从不”类型

  8. 8

    在TextArea中反应Typescript错误:类型'string'无法分配给类型编号

  9. 9

    PHP类型属性批量声明不能将null分配给可为空的字段

  10. 10

    类型'Observable <UI [] | 不能将Promise <any >>'分配给类型'Observable <UI []>'。输入'UI [] | Promise <any>'不能分配给类型'UI []'

  11. 11

    类型'false'不能分配给类型'(((status:number)=> boolean)| undefined'TypeScript

  12. 12

    输入“元素| undefined'不能分配给'ReactElement <any,string | ((道具:任何)

  13. 13

    类型'HTMLElement |的参数 “ null”不可分配给“ Element”类型的参数。类型'null'不能分配给类型'Element'.ts(2345)

  14. 14

    如何配置TypeScript来避免:类型'string'不能分配给类型'“ desc” | “ asc” | undefined'.ts(2322)?

  15. 15

    输入'string | 不能将null分配给类型'string | TypeScript未定义的错误

  16. 16

    JSX元素类型'ReactElement <any>不是JSX元素的构造函数。类型'undefined'不能分配给类型'Element | 空值'

  17. 17

    枚举类型的对象键-不能分配给'string | 编号| 符号'

  18. 18

    类型'HTMLCanvasElement |的参数 不能将'null'分配给类型的参数

  19. 19

    Typescript-如何解决“类型'undefined'不能分配给类型'XXXX'”的问题?

  20. 20

    键入“ Observable <用户| 空| undefined>'不能分配给类型'Observable <User>'

  21. 21

    键入“ Observable <用户| 空| undefined>'不能分配给类型'Observable <User>'

  22. 22

    TypeScript-类型'String'的参数不能分配给类型'string'的参数

  23. 23

    使用Angular Route Guard时:'Observable <true | undefined>'不能分配给类型>'Observable <boolean>'

  24. 24

    Typescript-无法将“ undefined”类型分配给“ string | type” 编号| 符号'

  25. 25

    TS2322:输入'Todo [] | “ null”不可分配给“ Todo []”类型。类型“ null”不可分配给类型“ Todo []”

  26. 26

    递增输入类型编号

  27. 27

    类型 'string' 不能分配给类型 '"foo"'

  28. 28

    “Params”类型的参数不能分配给“string”类型的参数

  29. 29

    输入 '(token: string) => Observable<{ headers: HttpHe aders; }>' 不可分配给类型 'Observable<any>'

热门标签

归档