Size: a a a

TypeScript — русскоговорящее сообщество

2020 April 22

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
Всем привет! Подскажите пожалуйста, можно ли в ts уточнить тип boolean, как true или false.

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

type SomeType = {
required: true;
var: number;
} | {
required: false;
var: number | null;
}

но компилятор typescript’а выдает ошибку: “type boolean is not assignable to type { required: true }”
источник

VK

Vladimir Kurchatkin in TypeScript — русскоговорящее сообщество
Вячеслав Волков
Всем привет! Подскажите пожалуйста, можно ли в ts уточнить тип boolean, как true или false.

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

type SomeType = {
required: true;
var: number;
} | {
required: false;
var: number | null;
}

но компилятор typescript’а выдает ошибку: “type boolean is not assignable to type { required: true }”
Да, так можно
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
Vladimir Kurchatkin
Да, так можно
так дело то в том, что нельзя) тайпскрипт не дает
источник

VK

Vladimir Kurchatkin in TypeScript — русскоговорящее сообщество
Вячеслав Волков
так дело то в том, что нельзя) тайпскрипт не дает
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
у меня компилятор жалуется что boolean не совместимо с true. Ладно, спасибо, буду разбираться
источник

A

Alex CherryTea in TypeScript — русскоговорящее сообщество
Вячеслав Волков
Всем привет! Подскажите пожалуйста, можно ли в ts уточнить тип boolean, как true или false.

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

type SomeType = {
required: true;
var: number;
} | {
required: false;
var: number | null;
}

но компилятор typescript’а выдает ошибку: “type boolean is not assignable to type { required: true }”
Выглядит так что вы передали объект туда где ожидался boolean
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
Alex CherryTea
Выглядит так что вы передали объект туда где ожидался boolean
да это я так ошибку скопировал с объекта выше уровнем, если смотреть конкретно в ошибку, то следующее выдает - Type 'boolean' is not assignable to type 'true'
источник

E

Evgen in TypeScript — русскоговорящее сообщество
Вячеслав Волков
да это я так ошибку скопировал с объекта выше уровнем, если смотреть конкретно в ошибку, то следующее выдает - Type 'boolean' is not assignable to type 'true'
Ну так у тебя true как тип с одним единственным значением true, что не соответствует boolean
источник

PS

Pavel Shakhov (pongo) in TypeScript — русскоговорящее сообщество
Наконец-то в тайпинги ноды добавили поддержку assert
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
Evgen
Ну так у тебя true как тип с одним единственным значением true, что не соответствует boolean
так я и указываю потом в объекте js true значение, а мне ощибка. я вот и спрашивал как сделать так, чтобы можно было указать значение true
источник

AB

Artyom Burkan in TypeScript — русскоговорящее сообщество
Вячеслав Волков
так я и указываю потом в объекте js true значение, а мне ощибка. я вот и спрашивал как сделать так, чтобы можно было указать значение true
Так как написано у тебя, я бы писать не стал.
Так код выглядит более логично и читаемо:
interface SomeType = {
   required: boolean;
   var?: number;
}

Или если очень нужен null, то:
interface SomeType = {
   required: boolean;
   var: number | null;
}
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
Artyom Burkan
Так как написано у тебя, я бы писать не стал.
Так код выглядит более логично и читаемо:
interface SomeType = {
   required: boolean;
   var?: number;
}

Или если очень нужен null, то:
interface SomeType = {
   required: boolean;
   var: number | null;
}
Ну а если челик напишет required: true и var: null, то это сломает все
источник

AB

Artyom Burkan in TypeScript — русскоговорящее сообщество
Вячеслав Волков
Ну а если челик напишет required: true и var: null, то это сломает все
Объект {required: true, var: null } — подойдёт под тип интерфейса. Или давай пример, без него не понятно.
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
Artyom Burkan
Объект {required: true, var: null } — подойдёт под тип интерфейса. Или давай пример, без него не понятно.
Схемы в монгусе например. Там есть флаг required для схемы, пример :
{ type: String, required: true }, допустим я хочу типом определять может ли переданное значение иметь тип null, если да, то required: false, иначе true
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
Мне тоже кажется все должно работать, но компилятор так не считает (
источник

VK

Vladimir Kurchatkin in TypeScript — русскоговорящее сообщество
Вячеслав Волков
Мне тоже кажется все должно работать, но компилятор так не считает (
Все и работает
источник

VK

Vladimir Kurchatkin in TypeScript — русскоговорящее сообщество
Примера, когда не работает, так и нет
источник

AB

Artyom Burkan in TypeScript — русскоговорящее сообщество
Вячеслав Волков
Схемы в монгусе например. Там есть флаг required для схемы, пример :
{ type: String, required: true }, допустим я хочу типом определять может ли переданное значение иметь тип null, если да, то required: false, иначе true
Очень абстрактно, я не понимаю что ты хочешь)
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
Vladimir Kurchatkin
Все и работает
import { Schema, SchemaTypeOpts } from 'mongoose';

type SchemaRef = SchemaTypeOpts<unknown> & {
type: typeof Schema.Types.ObjectId;
ref: string;
};

type IsRequired<T> = Extract<T, null> extends undefined ? true : false;

export type SchemaObject<T> = {
readonly [P in keyof T]-?: T[P] extends object
 ? T[P] extends Array<unknown>
  ? SchemaTypeOpts<unknown> & {
    required: IsRequired<T[P][0]>;
    type: Array<SchemaObject<T[P][0]> | SchemaRef>;
    }
  : SchemaObject<T[P]> | SchemaRef
 : SchemaTypeOpts<unknown> & {
   required: IsRequired<T[P]>;
   };
};
источник

ВВ

Вячеслав Волков in TypeScript — русскоговорящее сообщество
const userSchema: SchemaObject<{ login: string }> = {
login: {
 required: true,
 type: String,
},
}
источник