машинопись строгая. свойство состояния не является неопределенным

class AClass{
    aProp?:number=undefined;
    HasAProp():boolean{return this.aProp!==undefined;}
}
let anInst=new AClass;
if (anInst.aProp)     // standard check
    Math.sqrt(anInst.aProp);

if (anInst.HasAProp())    // custom check
    Math.sin(anInst.aProp);     // ts error:  Argument of type 'number | undefined' is not assignable to parameter of type 'number'.

В строгом режиме машинописный текст предупреждает об использовании, возможно, неопределенных свойств. И, что удивительно, он способен обнаруживать логику, предотвращающую это (как это происходит в строке с комментариями «стандартная проверка».

Но если логика более скрытая, как в «выборочной проверке», то нет. Я не ожидаю, что это будет очень умно, но как можно заявить, что свойство проверено? (пример тривиален, но в более сложных случаях может понадобиться)


person tru7    schedule 06.02.2018    source источник


Ответы (2)


В таких случаях, когда компилятор TypeScript не может определить, что свойство не является null или undefined, вы можете использовать ! (оператор ненулевого утверждения).

В вашем случае это будет означать:

if (anInst.HasAProp(anInst.aProp))
    Math.sin(anInst.aProp!);

Это эффективно сообщает компилятору, что вы знаете, что свойство определено в этот момент, даже если компилятор не может понять это.

Дополнительная информация здесь: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html

person Wickoo    schedule 06.02.2018

Вы можете использовать is.

class AClass {
    aProp?: number = undefined;
    HasAProp(aProp: this['aProp']): aProp is number {
        return aProp !== undefined;
    }
}

let anInst = new AClass;
if (anInst.aProp)
    Math.sqrt(anInst.aProp);

if (anInst.HasAProp(anInst.aProp))
    Math.sin(anInst.aProp);

Я не уверен, что это возможно без передачи aProp в HasAProp() в качестве параметра.

person Ciarán Tobin    schedule 06.02.2018
comment
Я не знал синтаксиса x is y, но подумал, что это можно сделать так: HasAProp(): this is AClass & { aProp: number }. - person Tao; 06.02.2018