Typescript null в объединительном типе не работает

#javascript #typescript

#javascript #typescript

Вопрос:

 interface Address {
  a: string
}

interface End {
  state: {
    addrList: null | (Address[]);
  };
}

class End {
  state = {
    addrList: [{
      a: '1'
    }],
  };
}  

 Error: Subsequent property declarations must have the same type. 
Property 'state' must be of type '{ addrList: Address[] | null; }', but here has type '{ addrList: { a: string; }[]; }'.
  

Затем я получил это.

Итак, я что-то упускаю?

https://www.typescriptlang.org/play?ts=4.0.2#code/JYOwLgpgTgZghgYwgAgIIBN1QgZx8gbwChlk4AuZHMKUAcyIF8ijRJZEUBREdQkqmDiRKxUqTiYoAGWDVKIAK4AbZcgA yABQYsuHAG0AugEoA3AMYXmRBMrh5kPPmMHCUAXn7iyU2fOQDVx8KZAByAEYwgVJGIwAaS2sgA

Онлайн-демонстрация

Комментарии:

1. Ваш пример отлично подходит для меня, на какой версии TypeScript вы работаете?

2. @Zer0 возможно, вы не используете строгий режим, попробуйте запустить tsc --init

3. Чего именно вы пытаетесь достичь с помощью этого кода? Вы создаете класс и интерфейс с одинаковыми именами, поэтому typescript пытается наложить их, но не может из-за несоответствия типов.

4. Вы пытаетесь сделать это ? Вы используете слияние объявлений в своем коде, но, вероятно, не должны этого делать.

5. typescriptlang.org/play?ts=4.0.2#code/…

Ответ №1:

Вы забыли реализовать интерфейс, поэтому ваш конечный класс не знает, что должно быть назначено addrList. Также в интерфейсе должен быть I перед именем (это просто шаблон), чтобы вы избежали столкновения имен.

Проверьте это

 interface IAddress {
  a: string
}

interface IEnd {
  state: {
    addrList: (IAddress[] | null);
  };
}

class End implements IEnd {
  state = {
    addrList: [{
      a: '1'
    }],
  };
}