Если вам не нужно решение generi c, вы можете использовать следующее:
MyNewType = { a: string }
| { b: string }
| { c: string }
| { d: string | undefined }
| { d: string | undefined };
Я не могу придумать, как сделать это для generi c type T
.
Но вы можете использовать другой подход: вместо того, чтобы просто выбирать одну пару значений ключа, вы можете использовать отдельные свойства для ключа и значения, например:
{
key: "a",
value: "a"
}
Это может должно выполняться обычным c способом:
type MyNewType<T> = {
key: keyof T;
value: T[keyof T];
}
Однако это не очень точно, так как вы можете комбинировать любой ключ с любым значением.
Другой подход был бы :
type MyNewType<T, K extends keyof T> = {
key: K;
value: T[K];
}
Работает так, как ожидалось, но вводит новый параметр типа для представления типа ключа. Например, вы можете использовать его как:
function dispatch<K extends keyof Test>(testPayload: MyNewType<Test, K>) {
// do something with payload
}
dispatch({ key: "a", value: "a" }); // OK
dispatch({ key: "a", value: undefined }); // Error, because Test.a cannot be undefined
dispatch({ key: "d", value: undefined }); // OK
dispatch({ key: "x", value: undefined }); // Error, because Test does not have property "x"
Edit
Я также пробовал следующее, чтобы создать тип точно так, как просили:
type MyNewType<T, K extends keyof T> = {
[key: K]: T[K];
}
Но TypeScript выдает следующую ошибку на key
:
Тип параметра подписи индекса должен быть либо 'string', либо 'number'.