Значения по умолчанию для интерфейса виджета

31

У меня есть следующий интерфейс в TypeScript:

interface IX {
    a: string,
    b: any,
    c: AnotherType
}

Объявляю переменную этого типа, и я инициализирую все свойства

let x: IX = {
    a: 'abc',
    b: null,
    c: null
}

Затем я присваиваю им реальные значения в функции init позже

x.a = 'xyz'
x.b = 123
x.c = new AnotherType()

Но мне не нравится указывать кучу нулевых значений по умолчанию для каждого свойства при объявлении объекта, когда они будут просто установлены позже на реальные значения. Могу ли я сообщить интерфейсу по умолчанию свойства, которые я не поставляю в null? Что бы я сделал это:

let x: IX = {
    a: 'abc'
}

без получения ошибки компилятора. Сейчас он говорит мне

  

TS2322: Тип '{}' не присваивается типу   'IX'. Свойство 'b' отсутствует в типе '{}'.

    
задан d512 29.01.2016 в 00:47
источник
  • Я добавил документы для вас: basarat.gitbooks.io/typescript/content/docs/tips/... –  basarat 29.01.2016 в 01:32
  • IMO, ответ stackoverflow.com/a/35074490/129196 не должен быть подходом. Если вы можете иметь объект в состоянии без инициализации всех его свойств и по-прежнему быть допустимым, вы должны объявить эти свойства как необязательные, как указано в этом ответе: stackoverflow.com/a/43226857/129196. В противном случае мы потеряем единственную цель использования машинописного текста (для безопасности типов). –  Charles Prakash Dasari 13.02.2018 в 03:26

3 ответа

40
  

Можно ли указать интерфейсу по умолчанию свойства, которые я не поставляю в null? Что позволило бы мне сделать это

Нет. Но по умолчанию они undefined , что в основном просто отлично. Вы можете использовать следующий шаблон, то есть иметь тип утверждения в точке создания:

let x: IX = {} as any;

x.a = 'xyz'
x.b = 123
x.c = new AnotherType()

У меня есть это и другие шаблоны, описанные здесь: Ссылка

    
ответ дан basarat 29.01.2016 в 00:58
источник
25

Вы не можете установить значения по умолчанию в интерфейсе, но вы можете выполнить то, что вы хотите сделать, используя дополнительные свойства (сравните абзац № 3):

Ссылка

Просто измените интерфейс на:

interface IX {
    a: string,
    b?: any,
    c?: AnotherType
}

Затем вы можете:

let x: IX = {
    a: 'abc'
}

И используйте функцию init для присвоения значений по умолчанию x.b и x.c , если эти свойства не установлены.

    
ответ дан Timar 05.04.2017 в 11:16
источник
  • В вопросе было предложено инициализировать x.b и x.c с нулем. При записи пусть x = {a: 'abc'}, то x.b и x.c не определены, поэтому этот ответ не полностью отвечает требованиям, хотя это умное быстрое исправление. –  Benny Neugebauer 17.03.2018 в 12:26
8

Вы можете реализовать интерфейс с классом, тогда вы можете справиться с инициализацией членов в конструкторе:

class IXClass implements IX {
    a: string;
    b: any;
    c: AnotherType;

    constructor(obj: IX);
    constructor(a: string, b: any, c: AnotherType);
    constructor() {
        if (arguments.length == 1) {
            this.a = arguments[0].a;
            this.b = arguments[0].b;
            this.c = arguments[0].c;
        } else {
            this.a = arguments[0];
            this.b = arguments[1];
            this.c = arguments[2];
        }
    }
}

Другой подход заключается в использовании заводской функции:

function ixFactory(a: string, b: any, c: AnotherType): IX {
    return {
        a: a,
        b: b,
        c: c
    }
}

Тогда вы можете просто:

var ix: IX = null;
...

ix = new IXClass(...);
// or
ix = ixFactory(...);
    
ответ дан Nitzan Tomer 29.01.2016 в 02:27
источник