тип машинописного текста теряется в объектном литеральном присваивании с использованием типа объединения - PullRequest
0 голосов
/ 21 декабря 2018

Я ожидал бы ошибку от следующего кода, но для машинописного текста все в порядке, вы можете сказать мне, почему?

export interface Type1 {
    command: number;
}

export interface Type2 {
    children: string;
}

export type UnionType = Type1 | Type2;

export const unionType: UnionType = {
    command: 34234,
    children: [{ foo: 'qwerty' }, { asdf: 'zxcv' }],
};

Здесь - ссылка.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Typescript в настоящее время не имеет концепции точных типов (есть исключение для литералов объекта, я объясню в конце).Другими словами, каждый объект некоторого интерфейса может иметь дополнительные свойства (которых нет в интерфейсе).

Следовательно, этот объект:

{
    command: 34234,
    children: [{ foo: 'qwerty' }, { asdf: 'zxcv' }],
}

удовлетворяет интерфейсу Type1, поскольку обладает всеми свойствами (command), но также удовлетворяет интерфейсу Type2, так как имеет всеа также его свойства (children).

Замечание об объектных литералах: typcript действительно реализует концепцию точного типа только для объектных литералов:

export const unionType: Type1 = {
    command: 34234,
    children: [{ foo: 'qwerty' }, { asdf: 'zxcv' }], // oops, not allowed here
};

export const unionType: Type2 = {
    command: 34234, // oops, not allowed here
    children: [{ foo: 'qwerty' }, { asdf: 'zxcv' }],
};

Выше приведен код, демонстрирующийобъектные литералы, и ниже код без них:

const someVar = {
    command: 34234,
    children: [{ foo: 'qwerty' }, { asdf: 'zxcv' }]
};

const: Type1 = someVar // ok, because assigning not an object literal but a variable
0 голосов
/ 21 декабря 2018

Конструкция export type UnionType = Type1 | Type2; означает, что экземпляры UnionType являются экземплярами Type1 или Type2.Это не обязательно означает, что они не могут быть примерами того и другого.

...