0

所以,我认为我的打字机 linter 短路了,因为我一生都无法弄清楚为什么这个 linting 错误会不断出现。

Type 'IConnectionState' is not assignable to type '{ connected: false; type: "none"; }'

下面是我的代码,你可以清楚地看到,应该没有任何后果。


export interface IConnectionState {
    connected: boolean;
    type: 'none' | 'player' | 'host';
}

export const ConnectionState: RecoilState<IConnectionState> = atom({
    key: 'connectionState',
    default: {
        connected: false,
        type: 'none'
    }
});

如果有帮助,我正在使用反冲。但是查看反冲类型,RecoilState应该类型采用default赋予其选项对象的值的子类型。

我迷路了。

4

3 回答 3

1

我在更简单的界面上看到了类似的问题。

export const myState: RecoilState<boolean> = atom({
  key: 'myState',
  default: false,
});

// Type '<RecoilState<false>' is not assignable to type 'RecoilState<boolean>'.

我可以通过声明来修复它,或者可能更好的是,在方法调用中default: false as boolean添加泛型:<T>

export const myState: RecoilState<boolean> = atom<boolean>({
  key: 'myState',
  default: false,
});

或者你可以完全省略类型声明,TypeScript 会计算出来。

于 2020-12-22T15:46:37.860 回答
0

这就是我在我们的 monorepo 中一直在做的事情。
为所有键创建一个全局文件,以尝试保持您不希望任何冲突的意识,因为有一个 Recoil 注册表。

export enum GlobalRecoilKeyEnum {
     ATOM_SOME_BOOLEAN_KEY= "ATOM_SOME_BOOLEAN_KEY",
}

创建一个原子的区域文件(Nx 允许我使用 linting 隔离访问。)

export const SomeBooleanAtom = atom({
    key: GlobalRecoilKeyEnum.ATOM_SOME_BOOLEAN_KEY,
    default: false
});

我在功能组件中的访问方式。

const isSomeBoolean: boolean = useRecoilValue<boolean>(SomeBooleanAtom);
const setSomeBoolean: SetterOrUpdater<boolean> = useSetRecoilState<boolean>(SomeBooleanAtom);
const [isPractice, setSomeBoolean]: [boolean, SetterOrUpdater<boolean>] = useRecoilValue<boolean>(SomeBooleanAtom);
于 2021-02-06T02:58:06.003 回答
0

实际上,linter 正在按预期工作。您正在将类型设置为ConnectionStateIConnectionState但您从未key在界面中包含该属性。

接口IConnectionState是正确的,但它应该嵌套在另一个接口中。

const NONE = 'none';
const PLAYER = 'player';
const HOST = 'host';
const CONNECTIONSTATE = "connectionState";

type TType = typeof NONE | typeof PLAYER | typeof HOST;

interface IConnectionStateDefault {
    connected: boolean;
    type: TType
}

interface IConnectionState {
    key: typeof CONNECTIONSTATE,
    default: IConnectionStateDefault
}


export const ConnectionState: RecoilState<IConnectionState> = atom({
    key: "connectionState",
    default: {
        connected: false,
        type: 'none'
    }
});

如果对它IConnectionState有更多的key价值,那么就像我TType对可能存在的类型形成一个联合所做的key一样。

于 2020-12-15T04:33:14.457 回答