Расширение прототипа типа

#typescript #typing

#typescript #ввод

Вопрос:

Я использую Vue3 и Typescript. По сути, я хочу добиться этого:

 export type PersonId = string;

export interface Person {
    id: PersonId,
    lastSeen: Date
}

export type PersonOrId = Person | PersonId;

PersonOrId.prototype.collapse = function (): PersonId {
    let id: PersonId;
    if (this.hasOwnProperty('id'))
        id = (this as Person).id;
    else
        id = this as PersonId;

    return id;
}
 

а затем позже в коде используйте функцию, чтобы сделать код более чистым:

 let result: PersonOrId = ...

let id = result.collapse()
 

Но, как оказалось, вы не можете prototype type . Могу ли я решить это с помощью interface ? Если да, то как?

Комментарии:

1. PersonID это просто псевдоним string , и расширение String.prototype действительно плохая идея для чего-то подобного. Вы уверены, что вам не нужна просто отдельная функция toPersonId(value: PersonOrId): PersonId ? вместо этого? Пример

2. @AlexWayne это также сделало бы работу. В будущем я, возможно, захочу добавить больше функций PersonId , и это может довольно быстро стать уродливым с глобальными функциями.

3. Ну, вы никогда не захотите добавлять методы PersonId , потому что это просто строка, и это добавит ее к прототипу ВСЕХ строк. Поэтому вам нужно будет придумать какой-то другой подход здесь. И требовать небольшой вспомогательной функции там, где она вам нужна, довольно просто.

4. Спасибо, я пока попробую вспомогательные функции!