Объект может быть проанализирован только с json - PullRequest
4 голосов
/ 08 апреля 2020

Я хочу указать тип таким образом, чтобы его обобщенный параметр c был объектом, который можно анализировать с json. Таким образом, нет функций, нет дат, нет других видов значений, которые не могут быть представлены в json. Как я могу это сделать?

Пример :

function get<T>(url: string): Promise<T> {
    return fetch(url).then(resp => resp.json())
}

interface Type1 {
    x: string;
}

interface Type2 {
    x: string;
    getX(): string;
}

interface Type3 {
    x: Date;
}

interface Type4 {
    x: {
        a: number[];
        b: { z: (string | null)[] };
    };
}

async function main() {
    var a = await get<Type1>("/")
    var b = await get<Type2>("/") // Want a error
    var c = await get<Type3>("/") // Want a error
    var d = await get<Type4>("/")
}

1 Ответ

2 голосов
/ 08 апреля 2020

Попробуйте создать интерфейс для желаемого типа, который задает объединение всех допустимых типов, например:

interface IJson {
    [key: string]: number | string | boolean | Array<number | string | boolean | IJson | null> | IJson | null;
}

Редактировать : После некоторых исследований выясняется, что TypeScript фактически предоставляет пример именно этого на их документах . Они рекомендуют это:

type Json =
    | string
    | number
    | boolean
    | null
    | { [property: string]: Json }
    | Json[];

Редактировать 2 : Проверьте мою обновленную (от вашего) песочницу , которая играет с некоторыми из этих вещей. К сожалению, невозможно передать аргумент интерфейса в T, если у интерфейса также нет подписи индекса, что-то вроде { [key: string]: string }. Вы должны быть в состоянии обойти это, изменив ваш интерфейс на определение типа, например type Type1 = { x: string }, которое затем должно работать просто отлично. Я знаю, что это не совсем то, что вы искали, но я не уверен, что в настоящее время (или когда-либо будет) поддержка этого в TypeScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...