#typescript
Вопрос:
У меня есть тип с id
полем (строка) и oldId
полем (число). Но я не хочу иметь это в одно и то же время
экс.
{ id: "1234", name: "foo" }
{ oldId: 1234, name: "bar" }
Я попробовал это :
export type WithId<T> = T amp; ({ id: string } | { oldId: number })
export type Product = WithId<{
name: string
}>
const product1: Product = {
oldId: 12345,
name: "foo"
}
const product2: Product = {
id: "12345",
name: "bar"
}
Это работает. Но когда это параметр, он не работает :
import { Product } from 'product'
export const someTest = (product: Product) => {
return product.id
}
Я получаю :
Property 'id' does not exist on type 'Product'.
Ответ №1:
Вам нужно будет объединить никогда с союзом, подобным приведенному ниже примеру.
Первая часть типа { name: string }
-это «общее» определение. Это может быть одно из нескольких свойств.
Затем за этим следует объединение «идентификатор типа string, но никогда oldId» ИЛИ «старый идентификатор типа number, но никогда id». Обратите внимание, что ?
в этом случае никогда не понадобится
Это очень полезная маленькая модель.
const product1 = { id: '1234', name: 'foo' };
const product2 = { oldId: 1234, name: 'bar' };
const product9 = { id: '1234', oldId: 1234, name: 'bar' };
type Product = { name: string } amp; (
| {
id: string;
oldId?: never;
}
| {
id?: never;
oldId: number;
}
);
const printProduct = (product: Product) => {
console.log(product.name);
}
printProduct(product1);
printProduct(product2);
printProduct(product9); // <-- won't be accepted, because product9 has both an id and an oldId