Все поля в JavaScript (и в TypeScript) могут иметь значение null
илиundefined
.
Вы можете сделать поле необязательным, что отличается от нуля.
interface Employee1 {
name: string;
salary: number;
}
var a: Employee1 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee1 = { name: 'Bob' }; // Not OK, you must have 'salary'
var c: Employee1 = { name: 'Bob', salary: undefined }; // OK
var d: Employee1 = { name: null, salary: undefined }; // OK
// OK
class SomeEmployeeA implements Employee1 {
public name = 'Bob';
public salary = 40000;
}
// Not OK: Must have 'salary'
class SomeEmployeeB implements Employee1 {
public name: string;
}
Сравнить с:
interface Employee2 {
name: string;
salary?: number;
}
var a: Employee2 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee2 = { name: 'Bob' }; // OK
var c: Employee2 = { name: 'Bob', salary: undefined }; // OK
var d: Employee2 = { name: null, salary: 'bob' }; // Not OK, salary must be a number
// OK, but doesn't make too much sense
class SomeEmployeeA implements Employee2 {
public name = 'Bob';
}
typescript@next
сейчас.)"strict" : false
salary:number|null;
Если вы это сделаете,salary?:number; salary = null;
вы получите ошибку. Однакоsalary = undefined;
в этом случае все будет работать нормально. Решение: используйте Union т.е. '|'Тип соединения на мой взгляд - лучший вариант в этом случае:
EDIT: Для этого , чтобы работать , как и ожидалось, вы должны включить
strictNullChecks
вtsconfig
.источник
Чтобы быть более похожим на C # , определите
Nullable
тип следующим образом:Бонус:
Чтобы
Nullable
поведение велось как встроенный тип Typescript, определите его вglobal.d.ts
файле определения в корневой папке источника. Этот путь работал для меня:/src/global.d.ts
источник
emp: Partial<Employee>
, мы можем сделатьemp.id
илиemp.name
т. Д., Но если у нас естьemp: Nullable<Employee>
, мы не можемemp.id
Просто добавьте знак вопроса
?
в дополнительное поле.источник
Вы можете просто реализовать определяемый пользователем тип, как показано ниже:
источник
источник
У меня был тот же вопрос некоторое время назад .. все типы в ts обнуляются, потому что void является подтипом всех типов (в отличие, например, от scala).
посмотрите, помогает ли эта блок-схема - https://github.com/bcherny/language-types-comparison#typescript
источник
void
«подтипа всех типов» ( нижний тип ), обратитесь к этой теме . Диаграмма, которую вы указали для scala, также неверна.Nothing
в Scala, на самом деле, нижний тип. Typescript, atm, не имеет нижнего типа, в то время как scala имеет .Обнуляемый тип может вызвать ошибку во время выполнения. Поэтому я думаю, что хорошо использовать опцию компилятора
--strictNullChecks
и объявитьnumber | null
как тип. также в случае вложенной функции, хотя тип ввода равен нулю, компилятор не может знать, что он может сломать, поэтому я рекомендую использовать!
(восклицательный знак).Ссылка. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions
источник