[英]Why TypeScript complains when assigning an object literal to a generic type extending object literals?
我不明白为什么 TypeScript 编译器抱怨这段代码:
import { useState, useEffect } from 'react';
function useSomething<T extends { [key: string]: any }>(): T {
const [state, setState] = useState<T>({}); // Argument of type '{}' is not assignable to parameter of type 'T | (() => T)'.
useEffect(() => {
setState({ hello: 'world' });
});
return state;
}
因为基本上,这段代码有效: const t: { [key: string]: any } = { hello: 'world' }
。
编辑:一个更好的例子,问题基本上是,是否可以在 TypeScript 中输入这个?
import { useState } from 'react';
function useComplexState<T extends Record<string, any>>() {
const [state, setState] = useState<T>({});
const setter = (key: keyof T, value: any) => {
setState((state) => ({ ...state, [key]: value }));
return state;
};
const getter = (key: keyof T) => {
return state[key];
}
return { set: setter, get: getter };
}
interface Person {
firstName: string;
lastName: string;
}
const personState = useComplexState<Person>();
personState.get('firstName');
personState.set('lastName', 'Smith');
关于代码的一些评论:
T
始终是 object {}
所以没有人应该能够做useComplexState<boolean>
T
,所以如果我使用useComplexState()
我应该只有一个通用的 object Record<string, any>
里面。state
设置一个默认值{}
。 在useState<T>({} as T)
中添加as T
修复了每个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.