Интерфейс машинописного текста с неизвестным именем ключа

Я пытаюсь создать интерфейс в Typescript, который имеет как неизвестные имена ключей, так и известные имена ключей. Что-то вроде этого:

interface Data { 
    test: string,
    [key: string]: string,
    foo?: boolean,
}

Так что я могу сделать это:

x: Data = {
  test: "test_string",
  "unknown_key": "value"
}

Кто-нибудь знает, как я могу это сделать? Спасибо.


person Luffy    schedule 07.12.2020    source источник
comment
Возможные типы [key: string] должны охватывать типы всех остальных свойств, поэтому в вашем случае [key: string]: string | boolean | undefined.   -  person Sergiu Paraschiv    schedule 07.12.2020


Ответы (2)



Вот вам пример:


// You can omit `test` property in Data interface since it has a string type
interface Data { 
    [key: string]: string,
    foo?: boolean,
}

// You can use Verify helper instead of Data interface. It is almost the same
type VerifyT<T> = { foo?: boolean } & { [K in keyof T]: K extends "foo" ? unknown : string };

const make = <T extends VerifyT<T>>(t: T) => t;
make({ age: 'sdf', foo: true }) // Ok
make({ age: 'sdf', foo: undefined }) // ok
make({ age: 'sdf', foo: undefined }) // false
make({ age: 'sdf', foo: 'some text' }) // error
make({ age: 'sdf', foo: 1 }) // error
make({ age: 'sdf', foo: [1] }) // error

Не беспокойтесь о накладных расходах функций, потому что, если вы используете движок V8, он будет на 99% встроен и оптимизирован.

Все градации идут в этот ответ .

Также не стесняйтесь помечать этот вопрос как дубликат

person captain-yossarian    schedule 07.12.2020